home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / gfx / x11 / xlincity098.lha / src / screen.cxx < prev    next >
C/C++ Source or Header  |  1997-08-26  |  116KB  |  3,439 lines

  1. //   screen.cxx   part of lin-city
  2. // Copyright (c) I J Peters 1995,1996.  Please read the file 'COPYRIGHT'.
  3.  
  4. extern "C" {
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. #ifdef LC_X11
  10. #include <X11/Xlib.h>
  11. #include <X11/Xatom.h>
  12. #include <X11/Xutil.h>
  13. #else
  14. #include <vga.h>
  15. #include <vgagl.h>
  16. #include <vgamouse.h>
  17. #endif
  18.  
  19. #include <math.h>
  20. #include <strings.h>
  21. #include <unistd.h>
  22.  
  23.  
  24. }
  25. #include "lcx11.h"
  26. #include "lctypes.h"
  27. #include "lin-city.h"
  28. #include "screen.h"
  29.  
  30. #ifdef CS_PROFILE
  31. void FPgl_write(int a,int b,char *s)
  32. {
  33.     gl_write(a,b,s);
  34. }
  35. void FPgl_getbox(int a,int b,int c,int d,void *e)
  36. {
  37.     gl_getbox(a,b,c,d,e);
  38. }
  39. void FPgl_putbox(int a,int b,int c,int d,void *e)
  40. {
  41.     gl_putbox(a,b,c,d,e);
  42. }
  43. void FPgl_fillbox(int a,int b,int c,int d,int e)
  44. {
  45.     gl_fillbox(a,b,c,d,e);
  46. }
  47. void FPgl_hline(int a,int b,int c,int d)
  48. {
  49.     gl_hline(a,b,c,d);
  50. }
  51. void FPgl_line(int a,int b,int c,int d,int e)
  52. {
  53.     gl_line(a,b,c,d,e);
  54. }
  55. void FPgl_setpixel(int a,int b,int c)
  56. {
  57.     gl_setpixel(a,b,c);
  58. }
  59. #endif
  60.  
  61. void refresh_main_screen(void)
  62. {
  63.     if (market_cb_flag || port_cb_flag)
  64.         return;
  65.         check_track_graphics();
  66.         check_rail_graphics();
  67.         check_road_graphics();
  68.     check_water_graphics();
  69.     check_power_line_graphics();
  70.     screen_refresh_flag=1;
  71.     update_main_screen();
  72.     update_mini_screen();
  73. }
  74.  
  75. void update_main_screen(void)
  76. {
  77.     int x,y,t1,t2,xm,ym;
  78. //  main_screen_origin[x|y] contain the mappoint of the top left of win
  79. #ifdef DEBUG_MAIN_SCREEN
  80.     printf("Updating main screen\n");
  81. #endif
  82.     if (help_flag || load_flag || save_flag)
  83.         return;
  84.     xm=main_screen_originx;
  85.     if (xm>3)
  86.         xm=3;
  87.     ym=main_screen_originy;
  88.     if (ym>3)
  89.         ym=3;
  90.     if (mouse_type==MOUSE_TYPE_SQUARE)
  91.         hide_mouse();
  92.     clip_main_window();
  93.     for (y=main_screen_originy-ym;y<main_screen_originy
  94.             +(MAIN_WIN_H/16);y++)
  95.         for (x=main_screen_originx-xm;x<main_screen_originx
  96.                 +(MAIN_WIN_W/16);x++)
  97.         {
  98.             if ((t1=mappointoldtype[x][y])
  99.                 !=(t2=mappointtype[x][y])
  100.                 || (screen_refresh_flag!=0
  101.                 && mappointtype[x][y]!=CST_USED))
  102.             {
  103.                 mappointoldtype[x][y]=mappointtype[x][y];
  104.                 Fgl_putbox(MAIN_WIN_X
  105.                 +(x-main_screen_originx)*16
  106.                 ,MAIN_WIN_Y
  107.                 +(y-main_screen_originy)*16
  108.                 ,16*main_types[t2].size
  109.                 ,16*main_types[t2].size
  110.                 ,main_types[t2].graphic);
  111.             }
  112.         }
  113.     unclip_main_window();
  114.     screen_refresh_flag=0;
  115.     if (mouse_type==MOUSE_TYPE_SQUARE)
  116.         redraw_mouse();
  117. }
  118.  
  119. void clip_main_window(void)
  120. {
  121.     Fgl_enableclipping();
  122.     Fgl_setclippingwindow(MAIN_WIN_X,MAIN_WIN_Y
  123.         ,MAIN_WIN_X+MAIN_WIN_W-1,MAIN_WIN_Y+MAIN_WIN_H-1);
  124. }
  125.  
  126. void unclip_main_window(void)
  127. {
  128.     Fgl_disableclipping();
  129. }
  130.  
  131. void check_power_line_graphics(void)
  132. {
  133.     int x,y,t,u,l,r,d,tu,tl,tr,td;
  134.         for (y=main_screen_originy;y<main_screen_originy
  135.             +(MAIN_WIN_W/16);y++)
  136.                 for (x=main_screen_originx
  137.             ;x<main_screen_originx+(MAIN_WIN_W/16);x++)
  138.         {
  139.             t=mappointtype[x][y];
  140.             if (main_types[t].group==GROUP_POWER_LINE)
  141.             {
  142.                 tu=tl=tr=td=CST_GREEN;
  143.                 if (y>0)
  144.                 {
  145.                     tu=mappointtype[x][y-1];
  146.             //  see if dug under track, rail or road
  147.                     if (y>1 && (main_types[tu].group
  148.                         ==GROUP_TRACK
  149.                     || main_types[tu].group==GROUP_RAIL
  150.                     || main_types[tu].group==GROUP_ROAD
  151.                     || main_types[tu].group==GROUP_WATER))
  152.                     tu=mappointtype[x][y-2];
  153.                 }
  154.                 if (x>0)
  155.                 {
  156.                     tl=mappointtype[x-1][y];
  157.                     if (x>1 && (main_types[tl].group
  158.                         ==GROUP_TRACK
  159.                     || main_types[tl].group==GROUP_RAIL
  160.                     || main_types[tl].group==GROUP_ROAD
  161.                     || main_types[tl].group==GROUP_WATER))
  162.                     tl=mappointtype[x-2][y];
  163.                 }
  164.                 if (x<(WORLD_SIDE_LEN-1))
  165.                 {
  166.                     tr=mappointtype[x+1][y];
  167.                     if (x<(WORLD_SIDE_LEN-2)
  168.                     && (main_types[tr].group==GROUP_TRACK
  169.                     || main_types[tr].group==GROUP_RAIL
  170.                     || main_types[tr].group==GROUP_ROAD
  171.                     || main_types[tr].group==GROUP_WATER))
  172.                     tr=mappointtype[x+2][y];
  173.                 }
  174.                 if (y<(WORLD_SIDE_LEN-1))
  175.                 {
  176.                     td=mappointtype[x][y+1];
  177.                     if (y<(WORLD_SIDE_LEN-2)
  178.                     && (main_types[td].group==GROUP_TRACK
  179.                     || main_types[td].group==GROUP_RAIL
  180.                     || main_types[td].group==GROUP_ROAD
  181.                     || main_types[td].group==GROUP_WATER))
  182.                     td=mappointtype[x][y+2];
  183.                 }
  184.                 u=l=r=d=0;
  185.                 if (main_types[tu].group==GROUP_POWER_LINE
  186.                 || main_types[tu].group==GROUP_POWER_SOURCE
  187.                 || main_types[tu].group==GROUP_SUBSTATION
  188. //            || (main_types[tu].group==GROUP_WINDMILL
  189. //            && mappoint[x][y].int_2>=MODERN_WINDMILL_TECH)
  190.             || main_types[tu].group==GROUP_POWER_SOURCE_COAL)
  191.                     u=1;
  192.                                 if (main_types[tl].group==GROUP_POWER_LINE
  193.                                 || main_types[tl].group==GROUP_POWER_SOURCE
  194.                 || main_types[tl].group==GROUP_SUBSTATION
  195. //            || (main_types[tl].group==GROUP_WINDMILL
  196. //            && mappoint[x][y].int_2>=MODERN_WINDMILL_TECH)
  197.             || main_types[tl].group==GROUP_POWER_SOURCE_COAL)
  198.                                         l=1;
  199.                                 if (main_types[tr].group==GROUP_POWER_LINE
  200.                                 || main_types[tr].group==GROUP_POWER_SOURCE
  201.                 || main_types[tr].group==GROUP_SUBSTATION
  202.             || (main_types[tr].group==GROUP_WINDMILL
  203.             && mappoint[x+1][y].int_2>=MODERN_WINDMILL_TECH)
  204.             || main_types[tr].group==GROUP_POWER_SOURCE_COAL)
  205.                                         r=1;
  206.                                 if (main_types[td].group==GROUP_POWER_LINE
  207.                                 || main_types[td].group==GROUP_POWER_SOURCE
  208.                 || main_types[td].group==GROUP_SUBSTATION
  209.             || (main_types[td].group==GROUP_WINDMILL
  210.             && mappoint[x][y+1].int_2>=MODERN_WINDMILL_TECH)
  211.             || main_types[td].group==GROUP_POWER_SOURCE_COAL)
  212.                                         d=1;
  213.                 mappointtype[x][y]
  214.                     =select_power_line_type(u,l,r,d);
  215. // do the live powerline stuff
  216.                 if (mappoint[x][y].int_1!=0)
  217.                     mappointtype[x][y]-=11;
  218.               }
  219.         }
  220. }
  221.  
  222. int select_power_line_type(int u,int l,int r,int d)
  223. {
  224.     if (u && l && r && d)
  225.         return(CST_POWERL_LUDR_D);
  226.     if (u && d && r)
  227.         return(CST_POWERL_UDR_D);
  228.     if (l && u && r)
  229.         return(CST_POWERL_LUR_D);
  230.     if (l && d && r)
  231.         return(CST_POWERL_LDR_D);
  232.     if (l && d && u)
  233.         return(CST_POWERL_LDU_D);
  234.     if (r && u)
  235.         return(CST_POWERL_RU_D);
  236.     if (l && u)
  237.         return(CST_POWERL_LU_D);
  238.     if (r && d)
  239.         return(CST_POWERL_RD_D);
  240.     if (l && d)
  241.         return(CST_POWERL_LD_D);
  242.     if (u || d)
  243.         return(CST_POWERL_V_D);
  244.     return(CST_POWERL_H_D);
  245. }
  246.  
  247.  
  248. void check_track_graphics(void)
  249. {
  250.     int x,y,t,u,l,r,d,tu,tl,tr,trc,td,tdc,trc2,trc3;
  251.     tu=tl=tr=trc=td=tdc=trc2=trc3=0;
  252.         for (y=main_screen_originy;y<main_screen_originy
  253.             +(MAIN_WIN_W/16);y++)
  254.                 for (x=main_screen_originx
  255.             ;x<main_screen_originx+(MAIN_WIN_W/16);x++)
  256.         {
  257.             t=mappointtype[x][y];
  258.             if (main_types[t].group==GROUP_TRACK)
  259.             {
  260.                 tu=tl=tr=td=trc=trc2=trc3=CST_GREEN;
  261.                 if (y>0)
  262.                     tu=mappointtype[x][y-1];
  263.                 if (x>0)
  264.                     tl=mappointtype[x-1][y];
  265.                 if (x<(WORLD_SIDE_LEN-1))
  266.                 {
  267.                     tr=mappointtype[x+1][y];
  268.                     if (y>0)
  269.                         trc=mappointtype[x+1][y-1];
  270.                     if (y>1)
  271.                         trc2=mappointtype[x+1][y-2];
  272.                     if (y>2)
  273.                         trc3=mappointtype[x+1][y-3];
  274.                 }
  275.                 if (y<(WORLD_SIDE_LEN-1))
  276.                 {
  277.                     td=mappointtype[x][y+1];
  278.                     if (x>0)
  279.                         tdc=mappointtype[x-1][y+1];
  280.                 }
  281.                 u=l=r=d=0;
  282.                 mappoint[x][y].flags &= 0xfffffff0;
  283.                 if (main_types[tu].group==GROUP_TRACK)
  284.                 {
  285.                     u=1;
  286.                     mappoint[x][y].flags |= FLAG_UP;
  287.                 }
  288.                                 if (main_types[tl].group==GROUP_TRACK)
  289.                 {
  290.                     l=1;
  291.                     mappoint[x][y].flags |= FLAG_LEFT;
  292.                 }
  293.                 if (main_types[tr].group==GROUP_TRACK)
  294.                     mappoint[x][y].flags |= FLAG_RIGHT;
  295.                                 if (main_types[tr].group==GROUP_TRACK
  296.                 || main_types[tr].group==GROUP_COALMINE
  297.                 || main_types[tr].group==GROUP_INDUSTRY_L
  298.                 || main_types[tr].group==GROUP_INDUSTRY_H
  299.                 || main_types[tr].group==GROUP_OREMINE
  300.                 || main_types[tr].group==GROUP_RECYCLE
  301.                 || main_types[tr].group==GROUP_TIP
  302.                 || main_types[tr].group==GROUP_PORT
  303.                 || main_types[tr].group==GROUP_COMMUNE
  304.             || main_types[trc].group==GROUP_POWER_SOURCE_COAL
  305.                                 )
  306.                                         r=1;
  307.                 if (main_types[td].group==GROUP_TRACK)
  308.                     mappoint[x][y].flags |= FLAG_DOWN;
  309.                                 if (main_types[td].group==GROUP_TRACK
  310.                 || main_types[td].group==GROUP_COALMINE
  311.                 || main_types[td].group==GROUP_INDUSTRY_L
  312.                 || main_types[td].group==GROUP_INDUSTRY_H
  313.                 || main_types[td].group==GROUP_OREMINE
  314.                 || main_types[td].group==GROUP_RECYCLE
  315.                 || main_types[td].group==GROUP_COMMUNE
  316.                 || main_types[td].group==GROUP_TIP
  317.                 || main_types[td].group==GROUP_PORT
  318.             || main_types[tdc].group==GROUP_POWER_SOURCE_COAL)
  319.                                         d=1;
  320.                 mappointtype[x][y]
  321.                     =select_track_type(u,l,r,d);
  322.               }
  323.         }
  324. }
  325.  
  326. int select_track_type(int u,int l,int r,int d)
  327. {
  328.     if (u && l && r && d)
  329.         return(CST_TRACK_LUDR);
  330.     if (u && d && r)
  331.         return(CST_TRACK_UDR);
  332.     if (l && u && r)
  333.         return(CST_TRACK_LUR);
  334.     if (l && d && r)
  335.         return(CST_TRACK_LDR);
  336.     if (l && d && u)
  337.         return(CST_TRACK_LUD);
  338.     if (r && u)
  339.         return(CST_TRACK_UR);
  340.     if (l && u)
  341.         return(CST_TRACK_LU);
  342.     if (r && d)
  343.         return(CST_TRACK_DR);
  344.     if (l && d)
  345.         return(CST_TRACK_LD);
  346.     if (u || d)
  347.         return(CST_TRACK_UD);
  348.     return(CST_TRACK_LR);
  349. }
  350.  
  351.  
  352. void check_water_graphics(void)
  353. {
  354.     int x,y,t,u,l,r,d,tu,tl,tr,td,xx,yy;
  355.     tu=tl=tr=td=0;
  356.         for (y=main_screen_originy;y<main_screen_originy
  357.             +(MAIN_WIN_W/16);y++)
  358.                 for (x=main_screen_originx
  359.             ;x<main_screen_originx+(MAIN_WIN_W/16);x++)
  360.         {
  361.             t=mappointtype[x][y];
  362.             if (main_types[t].group==GROUP_WATER)
  363.             {
  364.                 tu=tl=tr=td=CST_GREEN;
  365.                 if (y>0)
  366.                     tu=mappointtype[x][y-1];
  367.                 if (x>0)
  368.                     tl=mappointtype[x-1][y];
  369.                 if (x<(WORLD_SIDE_LEN-1))
  370.                     tr=mappointtype[x+1][y];
  371.                 if (y<(WORLD_SIDE_LEN-1))
  372.                     td=mappointtype[x][y+1];
  373.                 u=l=r=d=0;
  374.                 if (main_types[tu].group==GROUP_WATER)
  375.                 {
  376.                     u=1;
  377.                 }
  378.                                 if (main_types[tl].group==GROUP_WATER)
  379.                 {
  380.                                         l=1;
  381.                 }
  382.                 if (tl==CST_USED)
  383.                 {
  384.                     xx=mappoint[x-1][y].int_1;
  385.                     yy=mappoint[x-1][y].int_2;
  386.         if (main_types[mappointtype[xx][yy]].group==GROUP_EX_PORT)
  387.                     l=1;
  388.                 }
  389.                 if (main_types[tr].group==GROUP_WATER)
  390.                     r=1;
  391.                 if (main_types[td].group==GROUP_WATER)
  392.                     d=1;
  393.                 mappointtype[x][y]
  394.                     =select_water_type(u,l,r,d);
  395.               }
  396.         }
  397. }
  398.  
  399. int select_water_type(int u,int l,int r,int d)
  400. {
  401.         if (u && l && r && d)
  402.                 return(CST_WATER_LURD);
  403.         if (u && d && r)
  404.                 return(CST_WATER_URD);
  405.         if (l && u && r)
  406.                 return(CST_WATER_LUR);
  407.         if (l && d && r)
  408.                 return(CST_WATER_LRD);
  409.         if (l && d && u)
  410.                 return(CST_WATER_LUD);
  411.         if (r && u)
  412.                 return(CST_WATER_UR);
  413.         if (l && u)
  414.                 return(CST_WATER_LU);
  415.         if (r && d)
  416.                 return(CST_WATER_RD);
  417.         if (l && d)
  418.                 return(CST_WATER_LD);
  419.         if (u && d)
  420.                 return(CST_WATER_UD);
  421.     if (l && r)
  422.             return(CST_WATER_LR);
  423.     if (l)
  424.         return(CST_WATER_L);
  425.     if (u)
  426.         return(CST_WATER_U);
  427.     if (r)
  428.         return(CST_WATER_R);
  429.     if (d)
  430.         return(CST_WATER_D);
  431.     return(CST_WATER);
  432. }
  433.  
  434.  
  435. void check_rail_graphics(void)
  436. {
  437.     int x,y,t,u,l,r,d,tu,tl,tr,trc,td,tdc,trc2,trc3;
  438.     tu=tl=tr=trc=td=tdc=trc2=trc3=0;
  439.         for (y=main_screen_originy;y<main_screen_originy
  440.             +(MAIN_WIN_W/16);y++)
  441.                 for (x=main_screen_originx
  442.             ;x<main_screen_originx+(MAIN_WIN_W/16);x++)
  443.         {
  444.             t=mappointtype[x][y];
  445.             if (main_types[t].group==GROUP_RAIL)
  446.             {
  447.                 tu=tl=tr=td=tdc=trc=trc2=trc3=CST_GREEN;
  448.                 if (y>0)
  449.                     tu=mappointtype[x][y-1];
  450.                 if (x>0)
  451.                     tl=mappointtype[x-1][y];
  452.                 if (x<(WORLD_SIDE_LEN-1))
  453.                 {
  454.                     tr=mappointtype[x+1][y];
  455.                     if (y>0)
  456.                         trc=mappointtype[x+1][y-1];
  457.                     if (y>1)
  458.                         trc2=mappointtype[x+1][y-2];
  459.                     if (y>2)
  460.                         trc3=mappointtype[x+1][y-3];
  461.                 }
  462.                 if (y<(WORLD_SIDE_LEN-1))
  463.                 {
  464.                     td=mappointtype[x][y+1];
  465.                     if (x>0)
  466.                         tdc=mappointtype[x-1][y+1];
  467.                 }
  468.                 u=l=r=d=0;
  469.                 mappoint[x][y].flags &= 0xfffffff0;
  470.                 if (main_types[tu].group==GROUP_RAIL)
  471.                 {
  472.                     u=1;
  473.                     mappoint[x][y].flags |= FLAG_UP;
  474.                 }
  475.                                 if (main_types[tl].group==GROUP_RAIL)
  476.                 {
  477.                                         l=1;
  478.                     mappoint[x][y].flags |= FLAG_LEFT;
  479.                 }
  480.                 if (main_types[tr].group==GROUP_RAIL)
  481.                     mappoint[x][y].flags |= FLAG_RIGHT;
  482.                                 if (main_types[tr].group==GROUP_RAIL
  483.                 || main_types[tr].group==GROUP_COALMINE
  484.                 || main_types[tr].group==GROUP_INDUSTRY_L
  485.                 || main_types[tr].group==GROUP_INDUSTRY_H
  486.                 || main_types[tr].group==GROUP_OREMINE
  487.                 || main_types[tr].group==GROUP_RECYCLE
  488.                 || main_types[tr].group==GROUP_TIP
  489.                 || main_types[tr].group==GROUP_PORT
  490.             || main_types[trc].group==GROUP_POWER_SOURCE_COAL
  491.                                 )
  492.                                         r=1;
  493.                 if (main_types[td].group==GROUP_RAIL)
  494.                     mappoint[x][y].flags |= FLAG_DOWN;
  495.                                 if (main_types[td].group==GROUP_RAIL
  496.                 || main_types[td].group==GROUP_COALMINE
  497.                 || main_types[td].group==GROUP_INDUSTRY_L
  498.                 || main_types[td].group==GROUP_INDUSTRY_H
  499.                 || main_types[td].group==GROUP_OREMINE
  500.                 || main_types[td].group==GROUP_RECYCLE
  501.                 || main_types[td].group==GROUP_TIP
  502.                 || main_types[td].group==GROUP_PORT
  503.             || main_types[tdc].group==GROUP_POWER_SOURCE_COAL)
  504.                                         d=1;
  505.                 mappointtype[x][y]
  506.                     =select_rail_type(u,l,r,d);
  507.               }
  508.         }
  509. }
  510.  
  511. int select_rail_type(int u,int l,int r,int d)
  512. {
  513.     if (u && l && r && d)
  514.         return(CST_RAIL_LUDR);
  515.     if (u && d && r)
  516.         return(CST_RAIL_UDR);
  517.     if (l && u && r)
  518.         return(CST_RAIL_LUR);
  519.     if (l && d && r)
  520.         return(CST_RAIL_LDR);
  521.     if (l && d && u)
  522.         return(CST_RAIL_LUD);
  523.     if (r && u)
  524.         return(CST_RAIL_UR);
  525.     if (l && u)
  526.         return(CST_RAIL_LU);
  527.     if (r && d)
  528.         return(CST_RAIL_DR);
  529.     if (l && d)
  530.         return(CST_RAIL_LD);
  531.     if (u || d)
  532.         return(CST_RAIL_UD);
  533.     return(CST_RAIL_LR);
  534. }
  535.  
  536.  
  537. void check_road_graphics(void)
  538. {
  539.     int x,y,t,u,l,r,d,tu,tl,tr,trc,td,tdc,trc2,trc3;
  540.     tu=tl=tr=trc=td=tdc=trc2=trc3=0;
  541.         for (y=main_screen_originy;y<main_screen_originy
  542.             +(MAIN_WIN_W/16);y++)
  543.                 for (x=main_screen_originx
  544.             ;x<main_screen_originx+(MAIN_WIN_W/16);x++)
  545.         {
  546.             t=mappointtype[x][y];
  547.             if (main_types[t].group==GROUP_ROAD)
  548.             {
  549.                 tu=tl=tr=td=tdc=trc=trc2=trc3=CST_GREEN;
  550.                 if (y>0)
  551.                     tu=mappointtype[x][y-1];
  552.                 if (x>0)
  553.                     tl=mappointtype[x-1][y];
  554.                 if (x<(WORLD_SIDE_LEN-1))
  555.                 {
  556.                     tr=mappointtype[x+1][y];
  557.                     if (y>0)
  558.                         trc=mappointtype[x+1][y-1];
  559.                     if (y>1)
  560.                         trc2=mappointtype[x+1][y-2];
  561.                     if (y>2)
  562.                         trc3=mappointtype[x+1][y-3];
  563.                 }
  564.                 if (y<(WORLD_SIDE_LEN-1))
  565.                 {
  566.                     td=mappointtype[x][y+1];
  567.                     if (x>0)
  568.                         tdc=mappointtype[x-1][y+1];
  569.                 }
  570.                 u=l=r=d=0;
  571.                 mappoint[x][y].flags &= 0xfffffff0;
  572.                 if (main_types[tu].group==GROUP_ROAD)
  573.                 {
  574.                     u=1;
  575.                     mappoint[x][y].flags |= FLAG_UP;
  576.                 }
  577.                                 if (main_types[tl].group==GROUP_ROAD)
  578.                 {
  579.                                         l=1;
  580.                     mappoint[x][y].flags |= FLAG_LEFT;
  581.                 }
  582.                 if (main_types[tr].group==GROUP_ROAD)
  583.                     mappoint[x][y].flags |= FLAG_RIGHT;
  584.                                 if (main_types[tr].group==GROUP_ROAD
  585.                 || main_types[tr].group==GROUP_COALMINE
  586.                 || main_types[tr].group==GROUP_INDUSTRY_L
  587.                 || main_types[tr].group==GROUP_INDUSTRY_H
  588.                 || main_types[tr].group==GROUP_OREMINE
  589.                 || main_types[tr].group==GROUP_RECYCLE
  590.                 || main_types[tr].group==GROUP_TIP
  591.                 || main_types[tr].group==GROUP_PORT
  592.             || main_types[trc].group==GROUP_POWER_SOURCE_COAL
  593.                                 )
  594.                                         r=1;
  595.                 if (main_types[td].group==GROUP_ROAD)
  596.                     mappoint[x][y].flags |= FLAG_DOWN;
  597.                                 if (main_types[td].group==GROUP_ROAD
  598.                 || main_types[td].group==GROUP_COALMINE
  599.                 || main_types[td].group==GROUP_INDUSTRY_L
  600.                 || main_types[td].group==GROUP_INDUSTRY_H
  601.                 || main_types[td].group==GROUP_OREMINE
  602.                 || main_types[td].group==GROUP_RECYCLE
  603.                 || main_types[td].group==GROUP_TIP
  604.                 || main_types[td].group==GROUP_PORT
  605.             || main_types[tdc].group==GROUP_POWER_SOURCE_COAL)
  606.                                         d=1;
  607.                 mappointtype[x][y]
  608.                     =select_road_type(u,l,r,d);
  609.               }
  610.         }
  611. }
  612.  
  613. int select_road_type(int u,int l,int r,int d)
  614. {
  615.     if (u && l && r && d)
  616.         return(CST_ROAD_LUDR);
  617.     if (u && d && r)
  618.         return(CST_ROAD_UDR);
  619.     if (l && u && r)
  620.         return(CST_ROAD_LUR);
  621.     if (l && d && r)
  622.         return(CST_ROAD_LDR);
  623.     if (l && d && u)
  624.         return(CST_ROAD_LUD);
  625.     if (r && u)
  626.         return(CST_ROAD_UR);
  627.     if (l && u)
  628.         return(CST_ROAD_LU);
  629.     if (r && d)
  630.         return(CST_ROAD_DR);
  631.     if (l && d)
  632.         return(CST_ROAD_LD);
  633.     if (u || d)
  634.         return(CST_ROAD_UD);
  635.     return(CST_ROAD_LR);
  636. }
  637.  
  638. //  *******************
  639. //                        SCREEN SETUP
  640. //  *******************
  641. void screen_setup(void)
  642. {
  643.     int i;
  644. // draw the graph boxes
  645.     do_monthgraph();
  646. // load the pbar graphics
  647.     up_pbar1_graphic=load_graphic("pbarup1.csi");
  648.     up_pbar2_graphic=load_graphic("pbarup2.csi");
  649.     down_pbar1_graphic=load_graphic("pbardown1.csi");
  650.     down_pbar2_graphic=load_graphic("pbardown2.csi");
  651.     pop_pbar_graphic=load_graphic("pbarpop.csi");
  652.     tech_pbar_graphic=load_graphic("pbartech.csi");
  653.     food_pbar_graphic=load_graphic("pbarfood.csi");
  654.     jobs_pbar_graphic=load_graphic("pbarjobs.csi");
  655.     coal_pbar_graphic=load_graphic("pbarcoal.csi");
  656.     goods_pbar_graphic=load_graphic("pbargoods.csi");
  657.     ore_pbar_graphic=load_graphic("pbarore.csi");
  658.     steel_pbar_graphic=load_graphic("pbarsteel.csi");
  659.     money_pbar_graphic=load_graphic("pbarmoney.csi");
  660.     do_pbar_population(0);
  661.     do_pbar_tech(0);
  662.     do_pbar_food(0);
  663.     do_pbar_jobs(0);
  664.     do_pbar_coal(0);
  665.     do_pbar_goods(0);
  666.     do_pbar_ore(0);
  667.     do_pbar_steel(0);
  668.     do_pbar_money(0);
  669. // draw the box around the main window
  670.     draw_main_window_box(green(8));
  671. // load the checked and unchecked box graphics
  672.     checked_box_graphic=load_graphic("checked_box.csi");
  673.     unchecked_box_graphic=load_graphic("unchecked_box.csi");
  674. // draw the mini screen normal button
  675.     ms_normal_button_graphic=load_graphic("ms-normal-button.csi");
  676.     Fgl_putbox(MS_NORMAL_BUTTON_X,MS_NORMAL_BUTTON_Y
  677.         ,16,16,ms_normal_button_graphic);
  678. // draw the pollution button
  679.     ms_pollution_button_graphic=load_graphic("ms-pollution-button.csi");
  680.     Fgl_putbox(MS_POLLUTION_BUTTON_X,MS_POLLUTION_BUTTON_Y
  681.         ,16,16,ms_pollution_button_graphic);
  682. // draw the fire cover button
  683.         ms_fire_cover_button_graphic
  684.         =load_graphic("ms-fire-cover-button.csi");
  685.         Fgl_putbox(MS_FIRE_COVER_BUTTON_X,MS_FIRE_COVER_BUTTON_Y
  686.                 ,16,16,ms_fire_cover_button_graphic);
  687. // draw the health cover button
  688.         ms_health_cover_button_graphic
  689.                 =load_graphic("ms-health-cover-button.csi");
  690.         Fgl_putbox(MS_HEALTH_COVER_BUTTON_X,MS_HEALTH_COVER_BUTTON_Y
  691.                 ,16,16,ms_health_cover_button_graphic);
  692. // draw the cricket cover button
  693.         ms_cricket_cover_button_graphic
  694.                 =load_graphic("ms-cricket-cover-button.csi");
  695.         Fgl_putbox(MS_CRICKET_COVER_BUTTON_X,MS_CRICKET_COVER_BUTTON_Y
  696.                 ,16,16,ms_cricket_cover_button_graphic);
  697. // draw the ub40 button
  698.         ms_ub40_button_graphic=load_graphic("ms-ub40-button.csi");
  699.         Fgl_putbox(MS_UB40_BUTTON_X,MS_UB40_BUTTON_Y
  700.                 ,16,16,ms_ub40_button_graphic);
  701. // draw the coal button
  702.         ms_coal_button_graphic=load_graphic("ms-coal-button.csi");
  703.         Fgl_putbox(MS_COAL_BUTTON_X,MS_COAL_BUTTON_Y
  704.                 ,16,16,ms_coal_button_graphic);
  705. // draw the starving button
  706.         ms_starve_button_graphic=load_graphic("ms-starve-button.csi");
  707.         Fgl_putbox(MS_STARVE_BUTTON_X,MS_STARVE_BUTTON_Y
  708.                 ,16,16,ms_starve_button_graphic);
  709. // draw the other cost button
  710.         ms_ocost_button_graphic=load_graphic("ms-ocost-button.csi");
  711.         Fgl_putbox(MS_OCOST_BUTTON_X,MS_OCOST_BUTTON_Y
  712.                 ,16,16,ms_ocost_button_graphic);
  713.  
  714. // draw the pause button
  715.     pause_button1_off=load_graphic("pause-offl.csi");
  716.     Fgl_putbox(PAUSE_BUTTON_X,PAUSE_BUTTON_Y,16,16,pause_button1_off);
  717.     pause_button2_off=load_graphic("pause-offr.csi");
  718.     Fgl_putbox(PAUSE_BUTTON_X+16,PAUSE_BUTTON_Y
  719.         ,16,16,pause_button2_off);
  720.     pause_button1_on=load_graphic("pause-onl.csi");
  721.     pause_button2_on=load_graphic("pause-onr.csi");
  722.  
  723. // draw the slow button
  724.     slow_button1_off=load_graphic("slow-offl.csi");
  725.     Fgl_putbox(SLOW_BUTTON_X,SLOW_BUTTON_Y,16,16,slow_button1_off);
  726.     slow_button2_off=load_graphic("slow-offr.csi");
  727.     Fgl_putbox(SLOW_BUTTON_X+16,SLOW_BUTTON_Y
  728.         ,16,16,slow_button2_off);
  729.     slow_button1_on=load_graphic("slow-onl.csi");
  730.     slow_button2_on=load_graphic("slow-onr.csi");
  731.  
  732. // draw the medium button
  733.     med_button1_off=load_graphic("norm-offl.csi");
  734.     Fgl_putbox(MED_BUTTON_X,MED_BUTTON_Y,16,16,med_button1_off);
  735.     med_button2_off=load_graphic("norm-offr.csi");
  736.     Fgl_putbox(MED_BUTTON_X+16,MED_BUTTON_Y
  737.         ,16,16,med_button2_off);
  738.     med_button1_on=load_graphic("norm-onl.csi");
  739.     med_button2_on=load_graphic("norm-onr.csi");
  740.  
  741. // draw the fast button
  742.     fast_button1_off=load_graphic("fast-offl.csi");
  743.     Fgl_putbox(FAST_BUTTON_X,FAST_BUTTON_Y,16,16,fast_button1_off);
  744.     fast_button2_off=load_graphic("fast-offr.csi");
  745.     Fgl_putbox(FAST_BUTTON_X+16,FAST_BUTTON_Y
  746.         ,16,16,fast_button2_off);
  747.     fast_button1_on=load_graphic("fast-onl.csi");
  748.     fast_button2_on=load_graphic("fast-onr.csi");
  749.  
  750. // draw the results button
  751.         results_button1=load_graphic("results-l.csi");
  752.         Fgl_putbox(RESULTSBUT_X,RESULTSBUT_Y,16,16,results_button1);
  753.         results_button2=load_graphic("results-r.csi");
  754.         Fgl_putbox(RESULTSBUT_X+16,RESULTSBUT_Y
  755.                 ,16,16,results_button2);
  756.  
  757.  
  758. // draw the help button
  759.     help_button_graphic=load_graphic("help-button.csi");
  760.     Fgl_putbox(HELP_BUTTON_X,HELP_BUTTON_Y,HELP_BUTTON_W,HELP_BUTTON_H
  761.         ,help_button_graphic);
  762.  
  763. // draw the quit button
  764.     quit_button_graphic=load_graphic("quit-button.csi");
  765.     Fgl_putbox(QUIT_BUTTON_X,QUIT_BUTTON_Y,QUIT_BUTTON_W,QUIT_BUTTON_H
  766.         ,quit_button_graphic);
  767.  
  768. // draw the load button
  769.         load_button_graphic=load_graphic("load-button.csi");
  770.         Fgl_putbox(LOAD_BUTTON_X,LOAD_BUTTON_Y,LOAD_BUTTON_W,LOAD_BUTTON_H
  771.                 ,load_button_graphic);
  772.  
  773. // draw the save button
  774.         save_button_graphic=load_graphic("save-button.csi");
  775.         Fgl_putbox(SAVE_BUTTON_X,SAVE_BUTTON_Y,SAVE_BUTTON_W,SAVE_BUTTON_H
  776.                 ,save_button_graphic);
  777.  
  778. // draw border around mini screen
  779.         for (i=1;i<8;i++)
  780.         {
  781.                 Fgl_hline(MINI_SCREEN_X-1-i,MINI_SCREEN_Y-1-i
  782.                         ,MINI_SCREEN_X+WORLD_SIDE_LEN+1+i
  783.                         ,yellow(16));
  784.                 Fgl_line(MINI_SCREEN_X-1-i,MINI_SCREEN_Y-1-i
  785.                         ,MINI_SCREEN_X-1-i
  786.                         ,MINI_SCREEN_Y+WORLD_SIDE_LEN+1+i
  787.                         ,yellow(14));
  788.                 Fgl_hline(MINI_SCREEN_X-1-i
  789.                         ,MINI_SCREEN_Y+WORLD_SIDE_LEN+1+i
  790.                         ,MINI_SCREEN_X+WORLD_SIDE_LEN+1+i
  791.                         ,yellow(22));
  792.                 Fgl_line(MINI_SCREEN_X+WORLD_SIDE_LEN+1+i
  793.                         ,MINI_SCREEN_Y-1-i
  794.                         ,MINI_SCREEN_X+WORLD_SIDE_LEN+1+i
  795.                         ,MINI_SCREEN_Y+WORLD_SIDE_LEN+1+i
  796.                         ,yellow(24));
  797.         }
  798.  
  799.  
  800. // draw the select button box
  801.     Fgl_fillbox(SELECT_BUTTON_WIN_X,SELECT_BUTTON_WIN_Y
  802.         ,SELECT_BUTTON_WIN_W,SELECT_BUTTON_WIN_H,white(20));
  803.     redraw_mouse();
  804.     select_button_graphic[sbut[0]]=load_graphic("powerline-button.csi");
  805.     select_button_type[sbut[0]]=CST_POWERL_H_L;
  806.     strcpy(select_button_help[sbut[0]],"powerline.hlp");
  807.     draw_select_button_graphic(sbut[0],select_button_graphic[sbut[0]]);
  808.     select_button_cost[sbut[0]]=GROUP_POWER_LINE_COST;
  809.     select_button_cost_mul[sbut[0]]=GROUP_POWER_LINE_COST_MUL;
  810.     select_button_bul_cost[sbut[0]]=GROUP_POWER_LINE_BUL_COST;
  811.     select_button_tech[sbut[0]]=GROUP_POWER_LINE_TECH*MAX_TECH_LEVEL/1000;
  812.  
  813.     select_button_graphic[sbut[1]]=load_graphic("powerssolar-button.csi");
  814.     draw_select_button_graphic(sbut[1],select_button_graphic[sbut[1]]);
  815.     select_button_type[sbut[1]]=CST_POWERS_SOLAR;
  816.     strcpy(select_button_help[sbut[1]],"powerssolar.hlp");
  817.     select_button_cost[sbut[1]]=GROUP_POWER_SOURCE_COST;
  818.     select_button_cost_mul[sbut[1]]=GROUP_POWER_SOURCE_COST_MUL;
  819.     select_button_bul_cost[sbut[1]]=GROUP_POWER_SOURCE_BUL_COST;
  820.     select_button_tech[sbut[1]]=GROUP_POWER_SOURCE_TECH*MAX_TECH_LEVEL/1000;
  821.  
  822.     select_button_graphic[sbut[2]]=load_graphic("substation-button.csi");
  823.     draw_select_button_graphic(sbut[2],select_button_graphic[sbut[2]]);
  824.     select_button_type[sbut[2]]=CST_SUBSTATION_R;
  825.     strcpy(select_button_help[sbut[2]],"substation.hlp");
  826.     select_button_cost[sbut[2]]=GROUP_SUBSTATION_COST;
  827.     select_button_cost_mul[sbut[2]]=GROUP_SUBSTATION_COST_MUL;
  828.     select_button_bul_cost[sbut[2]]=GROUP_SUBSTATION_BUL_COST;
  829.     select_button_tech[sbut[2]]=GROUP_SUBSTATION_TECH*MAX_TECH_LEVEL/1000;
  830.  
  831.     select_button_graphic[sbut[3]]=load_graphic("residence-button.csi");
  832.     draw_select_button_graphic(sbut[3],select_button_graphic[sbut[3]]);
  833.     select_button_type[sbut[3]]=CST_RESIDENCE_0;
  834.     strcpy(select_button_help[sbut[3]],"residential.hlp");
  835.     select_button_cost[sbut[3]]=GROUP_RESIDENCE_COST;
  836.     select_button_cost_mul[sbut[3]]=GROUP_RESIDENCE_COST_MUL;
  837.     select_button_bul_cost[sbut[3]]=GROUP_RESIDENCE_BUL_COST;
  838.     select_button_tech[sbut[3]]=GROUP_RESIDENCE_TECH*MAX_TECH_LEVEL/1000;
  839.  
  840.         select_button_graphic[sbut[4]]=load_graphic("organic-farm-button.csi");
  841.         draw_select_button_graphic(sbut[4],select_button_graphic[sbut[4]]);
  842.         select_button_type[sbut[4]]=CST_FARM_O0;
  843.     strcpy(select_button_help[sbut[4]],"farm.hlp");
  844.     select_button_cost[sbut[4]]=GROUP_ORGANIC_FARM_COST;
  845.     select_button_cost_mul[sbut[4]]=GROUP_ORGANIC_FARM_COST_MUL;
  846.     select_button_bul_cost[sbut[4]]=GROUP_ORGANIC_FARM_BUL_COST;
  847.     select_button_tech[sbut[4]]=GROUP_ORGANIC_FARM_TECH*MAX_TECH_LEVEL/1000;
  848.  
  849.         select_button_graphic[sbut[5]]=load_graphic("market-button.csi");
  850.         draw_select_button_graphic(sbut[5],select_button_graphic[sbut[5]]);
  851.         select_button_type[sbut[5]]=CST_MARKET_EMPTY;
  852.     strcpy(select_button_help[sbut[5]],"market.hlp");
  853.     select_button_cost[sbut[5]]=GROUP_MARKET_COST;
  854.     select_button_cost_mul[sbut[5]]=GROUP_MARKET_COST_MUL;
  855.     select_button_bul_cost[sbut[5]]=GROUP_MARKET_BUL_COST;
  856.     select_button_tech[sbut[5]]=GROUP_MARKET_TECH*MAX_TECH_LEVEL/1000;
  857.  
  858.     select_button_graphic[sbut[6]]=load_graphic("buldoze-button.csi");
  859.     draw_select_button_graphic(sbut[6],select_button_graphic[sbut[6]]);
  860.     select_button_type[sbut[6]]=CST_GREEN;
  861.     strcpy(select_button_help[sbut[6]],"bulldoze.hlp");
  862.     select_button_cost[sbut[6]]=GROUP_BARE_COST;
  863.     select_button_cost_mul[sbut[6]]=GROUP_BARE_COST_MUL;
  864.     select_button_bul_cost[sbut[6]]=GROUP_BARE_BUL_COST;
  865.     select_button_tech[sbut[6]]=GROUP_BARE_TECH*MAX_TECH_LEVEL/1000;
  866.  
  867.         select_button_graphic[sbut[7]]=load_graphic("track-button.csi");
  868.         draw_select_button_graphic(sbut[7],select_button_graphic[sbut[7]]);
  869.         select_button_type[sbut[7]]=CST_TRACK_LR;
  870.     strcpy(select_button_help[sbut[7]],"track.hlp");
  871.     select_button_help_flag[sbut[7]]=1;
  872.     select_button_cost[sbut[7]]=GROUP_TRACK_COST;
  873.     select_button_cost_mul[sbut[7]]=GROUP_TRACK_COST_MUL;
  874.     select_button_bul_cost[sbut[7]]=GROUP_TRACK_BUL_COST;
  875.     select_button_tech[sbut[7]]=GROUP_TRACK_TECH*MAX_TECH_LEVEL/1000;
  876.  
  877.         select_button_graphic[sbut[8]]=load_graphic("coalmine-button.csi");
  878.         draw_select_button_graphic(sbut[8],select_button_graphic[sbut[8]]);
  879.         select_button_type[sbut[8]]=CST_COALMINE_EMPTY;
  880.     strcpy(select_button_help[sbut[8]],"coalmine.hlp");
  881.     select_button_cost[sbut[8]]=GROUP_COALMINE_COST;
  882.     select_button_cost_mul[sbut[8]]=GROUP_COALMINE_COST_MUL;
  883.     select_button_bul_cost[sbut[8]]=GROUP_COALMINE_BUL_COST;
  884.     select_button_tech[sbut[8]]=GROUP_COALMINE_TECH*MAX_TECH_LEVEL/1000;
  885.  
  886.         select_button_graphic[sbut[9]]=load_graphic("rail-button.csi");
  887.         draw_select_button_graphic(sbut[9],select_button_graphic[sbut[9]]);
  888.         select_button_type[sbut[9]]=CST_RAIL_LR;
  889.     strcpy(select_button_help[sbut[9]],"rail.hlp");
  890.     select_button_cost[sbut[9]]=GROUP_RAIL_COST;
  891.     select_button_cost_mul[sbut[9]]=GROUP_RAIL_COST_MUL;
  892.     select_button_bul_cost[sbut[9]]=GROUP_RAIL_BUL_COST;
  893.     select_button_tech[sbut[9]]=GROUP_RAIL_TECH*MAX_TECH_LEVEL/1000;
  894.  
  895.         select_button_graphic[sbut[10]]=load_graphic("powerscoal-button.csi");
  896.         draw_select_button_graphic(sbut[10],select_button_graphic[sbut[10]]);
  897.         select_button_type[sbut[10]]=CST_POWERS_COAL_EMPTY;
  898.     strcpy(select_button_help[sbut[10]],"powerscoal.hlp");
  899.     select_button_cost[sbut[10]]=GROUP_POWER_SOURCE_COAL_COST;
  900.     select_button_cost_mul[sbut[10]]=GROUP_POWER_SOURCE_COAL_COST_MUL;
  901.     select_button_bul_cost[sbut[10]]=GROUP_POWER_SOURCE_COAL_BUL_COST;
  902.     select_button_tech[sbut[10]]=GROUP_POWER_SOURCE_COAL_TECH*MAX_TECH_LEVEL/1000;
  903.  
  904.         select_button_graphic[sbut[11]]=load_graphic("road-button.csi");
  905.         draw_select_button_graphic(sbut[11],select_button_graphic[sbut[11]]);
  906.         select_button_type[sbut[11]]=CST_ROAD_LR;
  907.     strcpy(select_button_help[sbut[11]],"road.hlp");
  908.     select_button_cost[sbut[11]]=GROUP_ROAD_COST;
  909.     select_button_cost_mul[sbut[11]]=GROUP_ROAD_COST_MUL;
  910.     select_button_bul_cost[sbut[11]]=GROUP_ROAD_BUL_COST;
  911.     select_button_tech[sbut[11]]=GROUP_ROAD_TECH*MAX_TECH_LEVEL/1000;
  912.  
  913.         select_button_graphic[sbut[12]]=load_graphic("industryl-button.csi");
  914.         draw_select_button_graphic(sbut[12],select_button_graphic[sbut[12]]);
  915.         select_button_type[sbut[12]]=CST_INDUSTRY_L_C;
  916.     strcpy(select_button_help[sbut[12]],"industryl.hlp");
  917.         select_button_cost[sbut[12]]=GROUP_INDUSTRY_L_COST;
  918.     select_button_cost_mul[sbut[12]]=GROUP_INDUSTRY_L_COST_MUL;
  919.     select_button_bul_cost[sbut[12]]=GROUP_INDUSTRY_L_BUL_COST;
  920.     select_button_tech[sbut[12]]=GROUP_INDUSTRY_L_TECH*MAX_TECH_LEVEL/1000;
  921.  
  922.         select_button_graphic[sbut[13]]=load_graphic("university-button.csi");
  923.         draw_select_button_graphic(sbut[13],select_button_graphic[sbut[13]]);
  924.         select_button_type[sbut[13]]=CST_UNIVERSITY;
  925.     strcpy(select_button_help[sbut[13]],"university.hlp");
  926.         select_button_cost[sbut[13]]=GROUP_UNIVERSITY_COST;
  927.     select_button_cost_mul[sbut[13]]=GROUP_UNIVERSITY_COST_MUL;
  928.     select_button_bul_cost[sbut[13]]=GROUP_UNIVERSITY_BUL_COST;
  929.     select_button_tech[sbut[13]]=GROUP_UNIVERSITY_TECH*MAX_TECH_LEVEL/1000;
  930.  
  931.         select_button_graphic[sbut[14]]=load_graphic("commune-button.csi");
  932.         draw_select_button_graphic(sbut[14],select_button_graphic[sbut[14]]);
  933.         select_button_type[sbut[14]]=CST_COMMUNE_1;
  934.     strcpy(select_button_help[sbut[14]],"commune.hlp");
  935.         select_button_cost[sbut[14]]=GROUP_COMMUNE_COST;
  936.     select_button_cost_mul[sbut[14]]=GROUP_COMMUNE_COST_MUL;
  937.     select_button_bul_cost[sbut[14]]=GROUP_COMMUNE_BUL_COST;
  938.     select_button_tech[sbut[14]]=GROUP_COMMUNE_TECH*MAX_TECH_LEVEL/1000;
  939.  
  940.         select_button_graphic[sbut[15]]=load_graphic("oremine-button.csi");
  941.         draw_select_button_graphic(sbut[15],select_button_graphic[sbut[15]]);
  942.         select_button_type[sbut[15]]=CST_OREMINE_1;
  943.     strcpy(select_button_help[sbut[15]],"oremine.hlp");
  944.         select_button_cost[sbut[15]]=GROUP_OREMINE_COST;
  945.     select_button_cost_mul[sbut[15]]=GROUP_OREMINE_COST_MUL;
  946.     select_button_bul_cost[sbut[15]]=GROUP_OREMINE_BUL_COST;
  947.     select_button_tech[sbut[15]]=GROUP_OREMINE_TECH*MAX_TECH_LEVEL/1000;
  948.  
  949.         select_button_graphic[sbut[16]]=load_graphic("tip-button.csi");
  950.         draw_select_button_graphic(sbut[16],select_button_graphic[sbut[16]]);
  951.         select_button_type[sbut[16]]=CST_TIP_0;
  952.     strcpy(select_button_help[sbut[16]],"tip.hlp");
  953.         select_button_cost[sbut[16]]=GROUP_TIP_COST;
  954.     select_button_cost_mul[sbut[16]]=GROUP_TIP_COST_MUL;
  955.     select_button_bul_cost[sbut[16]]=GROUP_TIP_BUL_COST;
  956.     select_button_tech[sbut[16]]=GROUP_TIP_TECH*MAX_TECH_LEVEL/1000;
  957.  
  958.         select_button_graphic[sbut[17]]=load_graphic("port-button.csi");
  959.         draw_select_button_graphic(sbut[17],select_button_graphic[sbut[17]]);
  960.         select_button_type[sbut[17]]=CST_EX_PORT;
  961.     strcpy(select_button_help[sbut[17]],"port.hlp");
  962.         select_button_cost[sbut[17]]=GROUP_EX_PORT_COST;
  963.     select_button_cost_mul[sbut[17]]=GROUP_EX_PORT_COST_MUL;
  964.     select_button_bul_cost[sbut[17]]=GROUP_EX_PORT_BUL_COST;
  965.     select_button_tech[sbut[17]]=GROUP_EX_PORT_TECH*MAX_TECH_LEVEL/1000;
  966.  
  967.         select_button_graphic[sbut[18]]=load_graphic("industryh-button.csi");
  968.         draw_select_button_graphic(sbut[18],select_button_graphic[sbut[18]]);
  969.         select_button_type[sbut[18]]=CST_INDUSTRY_H_C;
  970.     strcpy(select_button_help[sbut[18]],"industryh.hlp");
  971.         select_button_cost[sbut[18]]=GROUP_INDUSTRY_H_COST;
  972.     select_button_cost_mul[sbut[18]]=GROUP_INDUSTRY_H_COST_MUL;
  973.     select_button_bul_cost[sbut[18]]=GROUP_INDUSTRY_H_BUL_COST;
  974.     select_button_tech[sbut[18]]=GROUP_INDUSTRY_H_TECH*MAX_TECH_LEVEL/1000;
  975.  
  976.         select_button_graphic[sbut[19]]=load_graphic("parkland-button.csi");
  977.         draw_select_button_graphic(sbut[19],select_button_graphic[sbut[19]]);
  978.         select_button_type[sbut[19]]=CST_PARKLAND_PLANE;
  979.     strcpy(select_button_help[sbut[19]],"park.hlp");
  980.         select_button_cost[sbut[19]]=GROUP_PARKLAND_COST;
  981.     select_button_cost_mul[sbut[19]]=GROUP_PARKLAND_COST_MUL;
  982.     select_button_bul_cost[sbut[19]]=GROUP_PARKLAND_BUL_COST;
  983.     select_button_tech[sbut[19]]=GROUP_PARKLAND_TECH*MAX_TECH_LEVEL/1000;
  984.  
  985.         select_button_graphic[sbut[20]]=load_graphic("recycle-button.csi");
  986.         draw_select_button_graphic(sbut[20],select_button_graphic[sbut[20]]);
  987.         select_button_type[sbut[20]]=CST_RECYCLE;
  988.     strcpy(select_button_help[sbut[20]],"recycle.hlp");
  989.         select_button_cost[sbut[20]]=GROUP_RECYCLE_COST;
  990.     select_button_cost_mul[sbut[20]]=GROUP_RECYCLE_COST_MUL;
  991.     select_button_bul_cost[sbut[20]]=GROUP_RECYCLE_BUL_COST;
  992.     select_button_tech[sbut[20]]=GROUP_RECYCLE_TECH*MAX_TECH_LEVEL/1000;
  993.  
  994.         select_button_graphic[sbut[21]]=load_graphic("water-button.csi");
  995.         draw_select_button_graphic(sbut[21],select_button_graphic[sbut[21]]);
  996.         select_button_type[sbut[21]]=CST_WATER;
  997.     strcpy(select_button_help[sbut[21]],"river.hlp");
  998.         select_button_cost[sbut[21]]=GROUP_WATER_COST;
  999.     select_button_cost_mul[sbut[21]]=GROUP_WATER_COST_MUL;
  1000.     select_button_bul_cost[sbut[21]]=GROUP_WATER_BUL_COST;
  1001.     select_button_tech[sbut[21]]=GROUP_WATER_TECH*MAX_TECH_LEVEL/1000;
  1002.  
  1003.         select_button_graphic[sbut[22]]=load_graphic("health-button.csi");
  1004.         draw_select_button_graphic(sbut[22],select_button_graphic[sbut[22]]);
  1005.         select_button_type[sbut[22]]=CST_HEALTH;
  1006.     strcpy(select_button_help[sbut[22]],"health.hlp");
  1007.         select_button_cost[sbut[22]]=GROUP_HEALTH_COST;
  1008.     select_button_cost_mul[sbut[22]]=GROUP_HEALTH_COST_MUL;
  1009.     select_button_bul_cost[sbut[22]]=GROUP_HEALTH_BUL_COST;
  1010.     select_button_tech[sbut[22]]=GROUP_HEALTH_TECH*MAX_TECH_LEVEL/1000;
  1011.  
  1012.         select_button_graphic[sbut[23]]=load_graphic("rocket-button.csi");
  1013.         draw_select_button_graphic(sbut[23],select_button_graphic[sbut[23]]);
  1014.         select_button_type[sbut[23]]=CST_ROCKET_1;
  1015.     strcpy(select_button_help[sbut[23]],"rocket.hlp");
  1016.         select_button_cost[sbut[23]]=GROUP_ROCKET_COST;
  1017.     select_button_cost_mul[sbut[23]]=GROUP_ROCKET_COST_MUL;
  1018.     select_button_bul_cost[sbut[23]]=GROUP_ROCKET_BUL_COST;
  1019.     select_button_tech[sbut[23]]=GROUP_ROCKET_TECH*MAX_TECH_LEVEL/1000;
  1020.  
  1021.         select_button_graphic[sbut[24]]=load_graphic("windmill-button.csi");
  1022.         draw_select_button_graphic(sbut[24],select_button_graphic[sbut[24]]);
  1023.         select_button_type[sbut[24]]=CST_WINDMILL_1_R;
  1024.     strcpy(select_button_help[sbut[24]],"windmill.hlp");
  1025.         select_button_cost[sbut[24]]=GROUP_WINDMILL_COST;
  1026.     select_button_cost_mul[sbut[24]]=GROUP_WINDMILL_COST_MUL;
  1027.     select_button_bul_cost[sbut[24]]=GROUP_WINDMILL_BUL_COST;
  1028.     select_button_tech[sbut[24]]=GROUP_WINDMILL_TECH*MAX_TECH_LEVEL/1000;
  1029.  
  1030.         select_button_graphic[sbut[25]]=load_graphic("monument-button.csi");
  1031.         draw_select_button_graphic(sbut[25],select_button_graphic[sbut[25]]);
  1032.         select_button_type[sbut[25]]=CST_MONUMENT_0;
  1033.     strcpy(select_button_help[sbut[25]],"monument.hlp");
  1034.         select_button_cost[sbut[25]]=GROUP_MONUMENT_COST;
  1035.     select_button_cost_mul[sbut[25]]=GROUP_MONUMENT_COST_MUL;
  1036.     select_button_bul_cost[sbut[25]]=GROUP_MONUMENT_BUL_COST;
  1037.     select_button_tech[sbut[25]]=GROUP_MONUMENT_TECH*MAX_TECH_LEVEL/1000;
  1038.  
  1039.         select_button_graphic[sbut[26]]=load_graphic("school-button.csi");
  1040.         draw_select_button_graphic(sbut[26],select_button_graphic[sbut[26]]);
  1041.         select_button_type[sbut[26]]=CST_SCHOOL;
  1042.     strcpy(select_button_help[sbut[26]],"school.hlp");
  1043.         select_button_cost[sbut[26]]=GROUP_SCHOOL_COST;
  1044.     select_button_cost_mul[sbut[26]]=GROUP_SCHOOL_COST_MUL;
  1045.         select_button_bul_cost[sbut[26]]=GROUP_SCHOOL_BUL_COST;
  1046.         select_button_tech[sbut[26]]=GROUP_SCHOOL_TECH*MAX_TECH_LEVEL/1000;
  1047.  
  1048.         select_button_graphic[sbut[27]]=load_graphic("blacksmith-button.csi");
  1049.         draw_select_button_graphic(sbut[27],select_button_graphic[sbut[27]]);
  1050.         select_button_type[sbut[27]]=CST_BLACKSMITH_0;
  1051.     strcpy(select_button_help[sbut[27]],"blacksmith.hlp");
  1052.         select_button_cost[sbut[27]]=GROUP_BLACKSMITH_COST;
  1053.     select_button_cost_mul[sbut[27]]=GROUP_BLACKSMITH_COST_MUL;
  1054.         select_button_bul_cost[sbut[27]]=GROUP_BLACKSMITH_BUL_COST;
  1055.         select_button_tech[sbut[27]]=GROUP_BLACKSMITH_TECH*MAX_TECH_LEVEL/1000;
  1056.  
  1057.         select_button_graphic[sbut[28]]=load_graphic("mill-button.csi");
  1058.         draw_select_button_graphic(sbut[28],select_button_graphic[sbut[28]]);
  1059.         select_button_type[sbut[28]]=CST_MILL_0;
  1060.     strcpy(select_button_help[sbut[28]],"mill.hlp");
  1061.         select_button_cost[sbut[28]]=GROUP_MILL_COST;
  1062.     select_button_cost_mul[sbut[28]]=GROUP_MILL_COST_MUL;
  1063.         select_button_bul_cost[sbut[28]]=GROUP_MILL_BUL_COST;
  1064.         select_button_tech[sbut[28]]=GROUP_MILL_TECH*MAX_TECH_LEVEL/1000;
  1065.  
  1066.         select_button_graphic[sbut[29]]=load_graphic("pottery-button.csi");
  1067.         draw_select_button_graphic(sbut[29],select_button_graphic[sbut[29]]);
  1068.         select_button_type[sbut[29]]=CST_POTTERY_0;
  1069.     strcpy(select_button_help[sbut[29]],"pottery.hlp");
  1070.         select_button_cost[sbut[29]]=GROUP_POTTERY_COST;
  1071.     select_button_cost_mul[sbut[29]]=GROUP_POTTERY_COST_MUL;
  1072.         select_button_bul_cost[sbut[29]]=GROUP_POTTERY_BUL_COST;
  1073.         select_button_tech[sbut[29]]=GROUP_POTTERY_TECH*MAX_TECH_LEVEL/1000;
  1074.  
  1075.         select_button_graphic[sbut[30]]=load_graphic("firestation-button.csi");
  1076.         draw_select_button_graphic(sbut[30],select_button_graphic[sbut[30]]);
  1077.         select_button_type[sbut[30]]=CST_FIRESTATION_1;
  1078.     strcpy(select_button_help[sbut[30]],"firestation.hlp");
  1079.         select_button_cost[sbut[30]]=GROUP_FIRESTATION_COST;
  1080.         select_button_cost_mul[sbut[30]]=GROUP_FIRESTATION_COST_MUL;
  1081.         select_button_bul_cost[sbut[30]]=GROUP_FIRESTATION_BUL_COST;
  1082.         select_button_tech[sbut[30]]=GROUP_FIRESTATION_TECH*MAX_TECH_LEVEL/1000;
  1083.  
  1084.         select_button_graphic[sbut[31]]=load_graphic("cricket-button.csi");
  1085.         draw_select_button_graphic(sbut[31],select_button_graphic[sbut[31]]);
  1086.         select_button_type[sbut[31]]=CST_CRICKET_1;
  1087.     strcpy(select_button_help[sbut[31]],"cricket.hlp");
  1088.         select_button_cost[sbut[31]]=GROUP_CRICKET_COST;
  1089.         select_button_cost_mul[sbut[31]]=GROUP_CRICKET_COST_MUL;
  1090.         select_button_bul_cost[sbut[31]]=GROUP_CRICKET_BUL_COST;
  1091.         select_button_tech[sbut[31]]=GROUP_CRICKET_TECH*MAX_TECH_LEVEL/1000;
  1092.  
  1093.     select_button_bul_cost[32]=GROUP_BURNT_BUL_COST;
  1094.  
  1095.     for (i=0;i<NUMOF_SELECT_BUTTONS;i++)
  1096.         select_button_tflag[i]=0;   // disable all the buttons
  1097. // then enable the ones that are available at the start
  1098.     update_select_buttons();
  1099.     update_main_screen();
  1100. }
  1101.  
  1102. void update_select_buttons(void)
  1103. {
  1104. #ifdef SELECT_BUTTONS_NEED_TECH
  1105.     int i,f;
  1106.     for (i=0;i<NUMOF_SELECT_BUTTONS;i++)
  1107.     {
  1108.         f=select_button_tflag[i];
  1109.         if (tech_level>=select_button_tech[i])
  1110.         {
  1111.             if (select_button_tflag[i]==0)
  1112.                 call_select_change_up(i);
  1113.             f=1;
  1114.         }
  1115.         else if (select_button_tflag[i]!=0 && tech_level
  1116.             <(select_button_tech[i]-(select_button_tech[i]/10)))
  1117.             f=0;
  1118.         if (select_button_tflag[i]!=f)
  1119.         {
  1120.             select_button_tflag[i]=f;
  1121. // Can take this 'if' out when all the buttons are there.
  1122. // Leave the command though!
  1123.              if (select_button_graphic[i]!=0)
  1124.                 draw_select_button_graphic(i
  1125.                     ,select_button_graphic[i]);
  1126.         }
  1127.     }
  1128. #else
  1129.     for (i=0;i<NUMOF_SELECT_BUTTONS;i++)  // make sure they are activated
  1130.         select_button_tflag[i]=1;   // - just a hack. 
  1131. #endif
  1132. }
  1133.  
  1134.  
  1135. void draw_main_window_box(int colour)
  1136. {
  1137.     int x;
  1138.         for (x=0;x<8;x++)
  1139.         {
  1140.                 Fgl_hline(MAIN_WIN_X-1-x,MAIN_WIN_Y-1-x
  1141.                         ,MAIN_WIN_X+MAIN_WIN_W+x,colour+x+x);
  1142.                 Fgl_hline(MAIN_WIN_X-1-x,MAIN_WIN_Y+MAIN_WIN_H+x
  1143.                         ,MAIN_WIN_X+MAIN_WIN_W+x,colour+x+x);
  1144.                 Fgl_line(MAIN_WIN_X-1-x,MAIN_WIN_Y-x,MAIN_WIN_X-1-x
  1145.                         ,MAIN_WIN_Y+MAIN_WIN_H+x,colour+x+x);
  1146.                 Fgl_line(MAIN_WIN_X+MAIN_WIN_W+x,MAIN_WIN_Y-x
  1147.                         ,MAIN_WIN_X+MAIN_WIN_W+x,MAIN_WIN_Y+MAIN_WIN_H+x
  1148.                         ,colour+x+x);
  1149.         }
  1150. }
  1151.  
  1152. void draw_select_button_graphic(int button,char *graphic)
  1153. {
  1154.     int x,y,xx,yy;
  1155.     if (button<NUMOF_SELECT_BUTTONS_DOWN)
  1156.     {
  1157.         x=8;
  1158.         y=8+(button*24);
  1159.     }
  1160.     else
  1161.     {
  1162.         x=8+24;
  1163.         y=8+((button-NUMOF_SELECT_BUTTONS_DOWN)*24);
  1164.     }
  1165.     Fgl_putbox(x+SELECT_BUTTON_WIN_X,y+SELECT_BUTTON_WIN_Y,16,16,graphic);
  1166.     unhighlight_select_button(button);
  1167.     hide_mouse();
  1168.     if (select_button_tflag[button]==0)
  1169.         {
  1170.         for (yy=-3;yy<19;yy++)
  1171.             for (xx=-3;xx<19;xx+=2)
  1172.                         Fgl_setpixel(x+xx+(yy%2)+SELECT_BUTTON_WIN_X
  1173.                     ,y+yy+SELECT_BUTTON_WIN_Y,white(15));
  1174.         }
  1175.     redraw_mouse();
  1176.  
  1177. }
  1178.  
  1179. #ifndef LC_X11
  1180. void setcustompalette(void)
  1181. {
  1182.         char s[100];
  1183.         int i,n,r,g,b,flag[256];
  1184.         FILE *inf;
  1185.         Palette pal;
  1186.         for (i=0;i<256;i++)
  1187.                 flag[i]=0;
  1188.         if ((inf=fopen(colour_pal_file,"r"))==0)
  1189.     {
  1190.         printf("The colour palette file <%s>... ",colour_pal_file);
  1191.                 do_error("Can't find it.");
  1192.     }
  1193.         while (feof(inf)==0)
  1194.         {
  1195.                 fgets(s,99,inf);
  1196.                 if (sscanf(s,"%d %d %d %d",&n,&r,&g,&b)==4)
  1197.                 {
  1198.                         pal.color[n].red=r;
  1199.                         pal.color[n].green=g;
  1200.                         pal.color[n].blue=b;
  1201.                         flag[n]=1;
  1202.                 }
  1203.         }
  1204.         fclose (inf);
  1205.         for (i=0;i<256;i++)
  1206.                 if (flag[i]==0)
  1207.                 {
  1208.                         printf("Colour %d not loaded\n",i);
  1209.                         do_error("Can't continue");
  1210.                 }
  1211.         gl_setpalette(&pal);
  1212. }
  1213. #endif
  1214.  
  1215.  
  1216. #ifndef LC_X11
  1217. void initfont()
  1218. {
  1219. #ifdef USE_EXPANDED_FONT
  1220.         void *font;
  1221.         font = malloc(256 * 8 * 8 * BYTESPERPIXEL);
  1222.         gl_expandfont(8, 8, white(24), gl_font8x8, font);
  1223.         gl_setfont(8, 8, font);
  1224. #else
  1225.     gl_setwritemode(FONT_COMPRESSED);
  1226.     gl_setfont(8,8,gl_font8x8);
  1227.     Fgl_setfontcolors(TEXT_BG_COLOUR,TEXT_FG_COLOUR);
  1228. #endif
  1229. }
  1230. #endif
  1231.  
  1232. void update_mini_screen(void)
  1233. {
  1234.         switch (mini_screen_flags)
  1235.         {
  1236.         case (0): draw_mini_screen(); break;
  1237.             case (MINI_SCREEN_POL_FLAG):
  1238.                         draw_mini_screen_pollution(); break;
  1239.                 case (MINI_SCREEN_UB40_FLAG):
  1240.                         draw_mini_screen_ub40(); break;
  1241.                 case (MINI_SCREEN_STARVE_FLAG):
  1242.                         draw_mini_screen_starve(); break;
  1243.         }
  1244. }
  1245.  
  1246. void draw_mini_screen(void)
  1247. {
  1248.     int x,y,xx,yy;
  1249.     mini_screen_flags=0;
  1250.     Fgl_write(MINI_SCREEN_X+12,MINI_SCREEN_Y+110,"          ");
  1251.     for (y=0;y<WORLD_SIDE_LEN;y++)
  1252.     for (x=0;x<WORLD_SIDE_LEN;x++)
  1253.     {
  1254.         if (mappointtype[x][y]==CST_USED)
  1255.         {
  1256.             xx=mappoint[x][y].int_1;
  1257.             yy=mappoint[x][y].int_2;
  1258.             Fgl_setpixel(MINI_SCREEN_X+x,MINI_SCREEN_Y+y
  1259.             ,group_colour[main_types\
  1260.             [mappointtype[xx][yy]].group]);
  1261.         }
  1262.         else
  1263.             Fgl_setpixel(MINI_SCREEN_X+x,MINI_SCREEN_Y+y
  1264.             ,group_colour[main_types[mappointtype[x][y]].group]);
  1265.     }
  1266.     draw_mini_screen_cursor();
  1267. }
  1268.  
  1269. void draw_mini_screen_pollution(void)
  1270. {
  1271.         int x,y,col;
  1272.     mini_screen_flags=MINI_SCREEN_POL_FLAG;
  1273.     Fgl_write(MINI_SCREEN_X+12,MINI_SCREEN_Y+110,"Pollution ");
  1274.         for (y=0;y<WORLD_SIDE_LEN;y++)
  1275.         for (x=0;x<WORLD_SIDE_LEN;x++)
  1276.         {
  1277.         if (mappointpol[x][y]<4)
  1278.             col=green(24);
  1279.         else if (mappointpol[x][y]<600)
  1280.             col=green(23-(mappointpol[x][y]/45));
  1281.         else
  1282.         {
  1283.             col=(int)sqrt((float)(mappointpol[x][y]-600))/9;
  1284.             if (col>20)
  1285.                 col=20;
  1286.             col+=red(11);
  1287.         }
  1288.                 Fgl_setpixel(MINI_SCREEN_X+x,MINI_SCREEN_Y+y,col);
  1289.         }
  1290.     draw_mini_screen_cursor();
  1291. }
  1292.  
  1293. void draw_mini_screen_fire_cover(void)
  1294. {
  1295.         int x,y,col;
  1296.     draw_mini_screen(); // this sets mini_screen_flags=0;
  1297.     Fgl_write(MINI_SCREEN_X+12,MINI_SCREEN_Y+110,"Fire cover");
  1298.         for (y=0;y<WORLD_SIDE_LEN;y++)
  1299.         for (x=0;x<WORLD_SIDE_LEN;x++)
  1300.         {
  1301.                 if ((mappoint[x][y].flags&FLAG_FIRE_COVER)==0)
  1302.                     Fgl_setpixel(MINI_SCREEN_X+x
  1303.                 ,MINI_SCREEN_Y+y,green(10));
  1304.         }
  1305. }
  1306.  
  1307. void draw_mini_screen_cricket_cover(void)
  1308. {
  1309.         int x,y,col;
  1310.         draw_mini_screen();
  1311.     Fgl_write(MINI_SCREEN_X+12,MINI_SCREEN_Y+110,"Crickt cvr");
  1312.         for (y=0;y<WORLD_SIDE_LEN;y++)
  1313.         for (x=0;x<WORLD_SIDE_LEN;x++)
  1314.         {
  1315.                 if ((mappoint[x][y].flags&FLAG_CRICKET_COVER)==0)
  1316.                         Fgl_setpixel(MINI_SCREEN_X+x
  1317.                                 ,MINI_SCREEN_Y+y,green(10));
  1318.         }
  1319. }
  1320.  
  1321.  
  1322. void draw_mini_screen_health_cover(void)
  1323. {
  1324.         int x,y,col;
  1325.         draw_mini_screen();
  1326.     Fgl_write(MINI_SCREEN_X+12,MINI_SCREEN_Y+110,"Health cvr");
  1327.         for (y=0;y<WORLD_SIDE_LEN;y++)
  1328.         for (x=0;x<WORLD_SIDE_LEN;x++)
  1329.         {
  1330.                 if ((mappoint[x][y].flags&FLAG_HEALTH_COVER)==0)
  1331.                         Fgl_setpixel(MINI_SCREEN_X+x
  1332.                                 ,MINI_SCREEN_Y+y,green(10));
  1333.         }
  1334. }
  1335.  
  1336. void draw_mini_screen_ub40(void)
  1337. {
  1338.         int x,y,col;
  1339.     mini_screen_flags=MINI_SCREEN_UB40_FLAG;
  1340.     Fgl_write(MINI_SCREEN_X+12,MINI_SCREEN_Y+110,"Unemploy't");
  1341.     Fgl_fillbox(MINI_SCREEN_X,MINI_SCREEN_Y
  1342.         ,WORLD_SIDE_LEN,WORLD_SIDE_LEN,green(14));
  1343.         for (y=0;y<WORLD_SIDE_LEN;y++)
  1344.         for (x=0;x<WORLD_SIDE_LEN;x++)
  1345.                 if (main_types[mappointtype[x][y]].group==GROUP_RESIDENCE)
  1346.         {
  1347.             if (mappoint[x][y].int_1<-20)
  1348.                 col=red(28);
  1349.             else if (mappoint[x][y].int_1<10)
  1350.                             col=red(14);
  1351.             else
  1352.                 col=green(20);
  1353.                     Fgl_fillbox(MINI_SCREEN_X+x,MINI_SCREEN_Y+y,3,3,col);
  1354.         }
  1355.     draw_mini_screen_cursor();
  1356. }
  1357.  
  1358. void draw_mini_screen_starve(void)
  1359. {
  1360.         int x,y,col;
  1361.     mini_screen_flags=MINI_SCREEN_STARVE_FLAG;
  1362.     Fgl_write(MINI_SCREEN_X+12,MINI_SCREEN_Y+110,"Starvation");
  1363.         Fgl_fillbox(MINI_SCREEN_X,MINI_SCREEN_Y
  1364.                 ,WORLD_SIDE_LEN,WORLD_SIDE_LEN,green(14));
  1365.         for (y=0;y<WORLD_SIDE_LEN;y++)
  1366.         for (x=0;x<WORLD_SIDE_LEN;x++)
  1367.                 if (main_types[mappointtype[x][y]].group==GROUP_RESIDENCE)
  1368.                 {
  1369.                         if ((total_time-mappoint[x][y].int_2)<20)
  1370.                                 col=red(28);
  1371.                         else if ((total_time-mappoint[x][y].int_2)<100)
  1372.                                 col=red(14);
  1373.                         else
  1374.                                 col=green(20);
  1375.             Fgl_fillbox(MINI_SCREEN_X+x,MINI_SCREEN_Y+y,3,3,col);
  1376.                 }
  1377.     draw_mini_screen_cursor();
  1378. }
  1379.  
  1380. void draw_mini_screen_coal(void)
  1381. {
  1382.         int x,y,col;
  1383.     mini_screen_flags=0;
  1384.     Fgl_write(MINI_SCREEN_X+12,MINI_SCREEN_Y+110,"Coal resrv");
  1385.         for (y=0;y<WORLD_SIDE_LEN;y++)
  1386.         for (x=0;x<WORLD_SIDE_LEN;x++)
  1387.         {
  1388.                 if (mappoint[x][y].coal_reserve==0)
  1389.                         col=white(4);
  1390.                 else if (mappoint[x][y].coal_reserve>=COAL_RESERVE_SIZE/2)
  1391.                         col=white(18);
  1392.                 else if (mappoint[x][y].coal_reserve<COAL_RESERVE_SIZE/2)
  1393.             col=white(28);
  1394.                 Fgl_setpixel(MINI_SCREEN_X+x,MINI_SCREEN_Y+y,col);
  1395.         }
  1396.     draw_mini_screen_cursor();
  1397. }
  1398.  
  1399. void draw_mini_screen_ocost(void)
  1400. {
  1401.         char s[100];
  1402.     mini_screen_flags=0;
  1403.     Fgl_write(MINI_SCREEN_X+12,MINI_SCREEN_Y+110,"Other cost");
  1404.         Fgl_fillbox(MINI_SCREEN_X,MINI_SCREEN_Y
  1405.                 ,WORLD_SIDE_LEN,WORLD_SIDE_LEN,green(12));
  1406.     Fgl_setfontcolors(green(12),TEXT_FG_COLOUR);
  1407.     sprintf(s,"OC yr %04d",(total_time/NUMOF_DAYS_IN_YEAR)-1);
  1408.     Fgl_write(MINI_SCREEN_X+10,MINI_SCREEN_Y+2,s);
  1409.  
  1410.         if (ly_interest>19999)
  1411.         {
  1412.                 if (ly_interest>1000000)
  1413.                         ly_interest=1000000;
  1414.                 sprintf(s,"Int %4dK",ly_interest/1000);
  1415.         }
  1416.         else
  1417.                 sprintf(s,"Int %5d",ly_interest);
  1418.     Fgl_write(MINI_SCREEN_X+10,MINI_SCREEN_Y+16,s);
  1419.  
  1420.         if (ly_school_cost>19999)
  1421.         {
  1422.                 if (ly_school_cost>1999999)
  1423.                         sprintf(s,"Scl %4dM",ly_school_cost/1000000);
  1424.                 else
  1425.                         sprintf(s,"Scl %4dK",ly_school_cost/1000);
  1426.         }
  1427.         else
  1428.                 sprintf(s,"Scl %5d",ly_school_cost);
  1429.         Fgl_write(MINI_SCREEN_X+10,MINI_SCREEN_Y+24,s);
  1430.  
  1431.         if (ly_university_cost>19999)
  1432.         {
  1433.                 if (ly_university_cost>1999999)
  1434.                         sprintf(s,"Uni %4dM",ly_university_cost/1000000);
  1435.                 else
  1436.                         sprintf(s,"Uni %4dK",ly_university_cost/1000);
  1437.         }
  1438.         else
  1439.                 sprintf(s,"Uni %5d",ly_university_cost);
  1440.     Fgl_write(MINI_SCREEN_X+10,MINI_SCREEN_Y+32,s);
  1441.  
  1442.         if (ly_deaths_cost>19999)
  1443.         {
  1444.                 if (ly_deaths_cost>1999999)
  1445.                         sprintf(s,"UnD %4dM",ly_deaths_cost/1000000);
  1446.                 else
  1447.                         sprintf(s,"UnD %4dK",ly_deaths_cost/1000);
  1448.         }
  1449.         else
  1450.                 sprintf(s,"UnD %5d",ly_deaths_cost);
  1451.         Fgl_write(MINI_SCREEN_X+10,MINI_SCREEN_Y+40,s);
  1452.  
  1453.         if (ly_windmill_cost>19999)
  1454.         {
  1455.                 if (ly_windmill_cost>1999999)
  1456.                         sprintf(s,"WiM %4dM",ly_windmill_cost/1000000);
  1457.                 else
  1458.                         sprintf(s,"WiM %4dK",ly_windmill_cost/1000);
  1459.         }
  1460.         else
  1461.                 sprintf(s,"WiM %5d",ly_windmill_cost);
  1462.         Fgl_write(MINI_SCREEN_X+10,MINI_SCREEN_Y+48,s);
  1463.  
  1464.         if (ly_recycle_cost>19999)
  1465.         {
  1466.                 if (ly_recycle_cost>1999999)
  1467.                         sprintf(s,"Rcy %4dM",ly_recycle_cost/1000000);
  1468.                 else
  1469.                         sprintf(s,"Rcy %4dK",ly_recycle_cost/1000);
  1470.         }
  1471.         else
  1472.                 sprintf(s,"Rcy %5d",ly_recycle_cost);
  1473.         Fgl_write(MINI_SCREEN_X+10,MINI_SCREEN_Y+56,s);
  1474.  
  1475.         if (ly_health_cost>19999)
  1476.         {
  1477.                 if (ly_health_cost>1999999)
  1478.                         sprintf(s,"Hth %4dM",ly_health_cost/1000000);
  1479.                 else
  1480.                         sprintf(s,"Hth %4dK",ly_health_cost/1000);
  1481.         }
  1482.         else
  1483.                 sprintf(s,"Hth %5d",ly_health_cost);
  1484.         Fgl_write(MINI_SCREEN_X+10,MINI_SCREEN_Y+64,s);
  1485.  
  1486.         if (ly_rocket_pad_cost>19999)
  1487.         {
  1488.                 if (ly_rocket_pad_cost>1999999)
  1489.                         sprintf(s,"Rok %4dM",ly_rocket_pad_cost/1000000);
  1490.                 else
  1491.                         sprintf(s,"Rok %4dK",ly_rocket_pad_cost/1000);
  1492.         }
  1493.         else
  1494.                 sprintf(s,"Rok %5d",ly_rocket_pad_cost);
  1495.         Fgl_write(MINI_SCREEN_X+10,MINI_SCREEN_Y+72,s);
  1496.  
  1497.         if (ly_fire_cost>19999)
  1498.         {
  1499.                 if (ly_fire_cost>1999999)
  1500.                         sprintf(s,"Fst %4dM",ly_fire_cost/1000000);
  1501.                 else
  1502.                         sprintf(s,"Fst %4dK",ly_fire_cost/1000);
  1503.         }
  1504.         else
  1505.                 sprintf(s,"Fst %5d",ly_fire_cost);
  1506.         Fgl_write(MINI_SCREEN_X+10,MINI_SCREEN_Y+80,s);
  1507.  
  1508.         if (ly_cricket_cost>19999)
  1509.         {
  1510.                 if (ly_cricket_cost>1999999)
  1511.                         sprintf(s,"Fst %4dM",ly_cricket_cost/1000000);
  1512.                 else
  1513.                         sprintf(s,"Fst %4dK",ly_cricket_cost/1000);
  1514.         }
  1515.         else
  1516.                 sprintf(s,"Ckt %5d",ly_cricket_cost);
  1517.         Fgl_write(MINI_SCREEN_X+10,MINI_SCREEN_Y+88,s);
  1518.  
  1519.     Fgl_setfontcolors(TEXT_BG_COLOUR,TEXT_FG_COLOUR);
  1520. }
  1521.  
  1522.  
  1523. void draw_mini_screen_cursor(void)
  1524. {
  1525.     Fgl_hline(MINI_SCREEN_X+main_screen_originx
  1526.         ,MINI_SCREEN_Y+main_screen_originy
  1527.         ,MINI_SCREEN_X+main_screen_originx+MAIN_WIN_W/16-1
  1528.         ,green(30));
  1529.     Fgl_hline(MINI_SCREEN_X+main_screen_originx
  1530.         ,MINI_SCREEN_Y+main_screen_originy+MAIN_WIN_H/16-1
  1531.         ,MINI_SCREEN_X+main_screen_originx+MAIN_WIN_W/16-1
  1532.         ,green(30));
  1533.     Fgl_line(MINI_SCREEN_X+main_screen_originx
  1534.         ,MINI_SCREEN_Y+main_screen_originy
  1535.         ,MINI_SCREEN_X+main_screen_originx
  1536.         ,MINI_SCREEN_Y+main_screen_originy+MAIN_WIN_H/16-1
  1537.         ,green(30));
  1538.     Fgl_line(MINI_SCREEN_X+main_screen_originx+MAIN_WIN_W/16-1
  1539.         ,MINI_SCREEN_Y+main_screen_originy
  1540.         ,MINI_SCREEN_X+main_screen_originx+MAIN_WIN_W/16-1
  1541.         ,MINI_SCREEN_Y+main_screen_originy+MAIN_WIN_H/16-1
  1542.         ,green(30));
  1543.  
  1544. }
  1545.  
  1546. void print_stats(void)
  1547. {
  1548.     static int flag=0;
  1549.     static int tfood_in_markets=0,tjobs_in_markets=0;
  1550.     static int tcoal_in_markets=0,tgoods_in_markets=0;
  1551.     static int tore_in_markets=0,tsteel_in_markets=0;
  1552.     int i;
  1553.     char s[100];
  1554.     if (flag==0)
  1555.     {
  1556.         hide_mouse();
  1557.         Fgl_write(STATS_X,STATS_Y,"Population ");
  1558.         Fgl_write(STATS_X,STATS_Y+8,"% Starving ");
  1559.         Fgl_write(STATS_X,STATS_Y+16,"Foodstore ");
  1560.         Fgl_write(STATS_X,STATS_Y+24,"% u-ployed ");
  1561.         Fgl_write(STATS_X+18*8,STATS_Y,"Tech level   ");
  1562.         Fgl_write(STATS_X+18*8,STATS_Y+8,"Un-nat deaths ");
  1563.         Fgl_write(STATS_X+18*8,STATS_Y+16,"Rockets  ");
  1564.         Fgl_write(STATS_X+18*8,STATS_Y+24,"Shanty towns");
  1565.         for (i=1;i<8;i++)
  1566.                 {
  1567. // stats window
  1568.                         Fgl_hline(STATS_X-1-i,STATS_Y-1-i
  1569.                                 ,STATS_X+STATS_W+1+i
  1570.                                 ,yellow(16));
  1571.                         Fgl_line(STATS_X-1-i,STATS_Y-1-i
  1572.                                 ,STATS_X-1-i
  1573.                                 ,STATS_Y+STATS_H+1+i
  1574.                                 ,yellow(14));
  1575.                         Fgl_hline(STATS_X-1-i
  1576.                                 ,STATS_Y+STATS_H+1+i
  1577.                                 ,STATS_X+STATS_W+1+i
  1578.                                 ,yellow(22));
  1579.                         Fgl_line(STATS_X+STATS_W+1+i
  1580.                                 ,STATS_Y-1-i
  1581.                                 ,STATS_X+STATS_W+1+i
  1582.                                 ,STATS_Y+STATS_H+1+i
  1583.                                 ,yellow(24));
  1584.  
  1585. // finance window
  1586.                         Fgl_hline(FINANCE_X-1-i,FINANCE_Y-1-i
  1587.                                 ,FINANCE_X+FINANCE_W+1+i
  1588.                                 ,yellow(16));
  1589.                         Fgl_line(FINANCE_X-1-i,FINANCE_Y-1-i
  1590.                                 ,FINANCE_X-1-i
  1591.                                 ,FINANCE_Y+FINANCE_H+1+i
  1592.                                 ,yellow(14));
  1593.                         Fgl_hline(FINANCE_X-1-i
  1594.                                 ,FINANCE_Y+FINANCE_H+1+i
  1595.                                 ,FINANCE_X+FINANCE_W+1+i
  1596.                                 ,yellow(22));
  1597.                         Fgl_line(FINANCE_X+FINANCE_W+1+i
  1598.                                 ,FINANCE_Y-1-i
  1599.                                 ,FINANCE_X+FINANCE_W+1+i
  1600.                                 ,FINANCE_Y+FINANCE_H+1+i
  1601.                                 ,yellow(24));
  1602.         }
  1603.         Fgl_write(FINANCE_X,FINANCE_Y,"Income  Expend");
  1604.         Fgl_write(FINANCE_X,FINANCE_Y+8,"IT");
  1605.         Fgl_write(FINANCE_X,FINANCE_Y+16,"CT");
  1606.         Fgl_write(FINANCE_X,FINANCE_Y+24,"GT");
  1607.         Fgl_write(FINANCE_X,FINANCE_Y+32,"XP");
  1608.         Fgl_write(FINANCE_X+64,FINANCE_Y+8,"OC");
  1609.         Fgl_write(FINANCE_X+64,FINANCE_Y+16,"UC");
  1610.         Fgl_write(FINANCE_X+64,FINANCE_Y+24,"TC");
  1611.         Fgl_write(FINANCE_X+64,FINANCE_Y+32,"IP");
  1612.         Fgl_write(FINANCE_X,FINANCE_Y+48,"Tot");
  1613.         income_tax_rate=INCOME_TAX_RATE;
  1614.         coal_tax_rate=COAL_TAX_RATE;
  1615.         goods_tax_rate=GOODS_TAX_RATE;
  1616.         dole_rate=DOLE_RATE;
  1617.         transport_cost_rate=TRANSPORT_COST_RATE;
  1618.         import_cost_rate=IM_PORT_COST_RATE;
  1619.         flag=1;
  1620.         redraw_mouse();
  1621.     }
  1622.     tpopulation+=population;
  1623.     tstarving_population+=starving_population;
  1624.     tfood_in_markets+=food_in_markets/1000;
  1625.     tjobs_in_markets+=jobs_in_markets/1000;
  1626.     tcoal_in_markets+=coal_in_markets/250;
  1627.     tgoods_in_markets+=goods_in_markets/500;
  1628.     tore_in_markets+=ore_in_markets/500;
  1629.     tsteel_in_markets+=steel_in_markets/25;
  1630.     tunemployed_population+=unemployed_population;
  1631.  
  1632.     if (total_time%NUMOF_DAYS_IN_MONTH==(NUMOF_DAYS_IN_MONTH-5))
  1633.         update_select_buttons();
  1634.     hide_mouse();
  1635.     if (total_time%NUMOF_DAYS_IN_MONTH==(NUMOF_DAYS_IN_MONTH-20))
  1636.     {
  1637.         do_pbar_population(population);
  1638.         do_pbar_tech(tech_level);
  1639.         do_pbar_money(total_money/400);
  1640.     }
  1641.     else if (total_time%NUMOF_DAYS_IN_MONTH==(NUMOF_DAYS_IN_MONTH-1))
  1642.     {
  1643.         do_monthgraph();
  1644.         housed_population=(tpopulation/NUMOF_DAYS_IN_MONTH);
  1645.         if ((housed_population+people_pool)>max_pop_ever)
  1646.             max_pop_ever=housed_population+people_pool;
  1647.         sprintf(s,"%5d ",housed_population+people_pool);
  1648.         Fgl_write(STATS_X+8*11,STATS_Y,s);
  1649.  
  1650.         i=((tstarving_population/NUMOF_DAYS_IN_MONTH)
  1651.             *1000)/((tpopulation/NUMOF_DAYS_IN_MONTH)+1);
  1652.         sprintf(s,"%3d.%1d ",i/10,i%10);
  1653.         Fgl_write(STATS_X+8*11,STATS_Y+8,s);
  1654.  
  1655.         sprintf(s,"%5d ",tfood_in_markets/NUMOF_DAYS_IN_MONTH);
  1656.         Fgl_write(STATS_X+8*11,STATS_Y+16,s);
  1657.         do_pbar_food(tfood_in_markets/NUMOF_DAYS_IN_MONTH);
  1658.         do_pbar_jobs(tjobs_in_markets/NUMOF_DAYS_IN_MONTH);
  1659.         do_pbar_coal(tcoal_in_markets/NUMOF_DAYS_IN_MONTH);
  1660.         do_pbar_goods(tgoods_in_markets/NUMOF_DAYS_IN_MONTH);
  1661.         do_pbar_ore(tore_in_markets/NUMOF_DAYS_IN_MONTH);
  1662.         do_pbar_steel(tsteel_in_markets/NUMOF_DAYS_IN_MONTH);
  1663.         i=((tunemployed_population/NUMOF_DAYS_IN_MONTH)
  1664.             *1000)/((tpopulation/NUMOF_DAYS_IN_MONTH)+1);
  1665.         sprintf(s,"%3d.%1d ",i/10,i%10);
  1666.         Fgl_write(STATS_X+8*11,STATS_Y+24,s);
  1667.  
  1668. //        people_pool-=(people_pool/50);
  1669. // 
  1670.         if (people_pool>100)
  1671.         {
  1672.             if (rand()%1000<people_pool)
  1673.                 people_pool-=10;
  1674. //                    if (rand()%1000<people_pool)
  1675. //                            people_pool-=5;
  1676.         }
  1677.         if (people_pool<0)
  1678.             people_pool=0;
  1679.  
  1680.                 sprintf(s,"%5d ",numof_shanties);
  1681.                 Fgl_write(STATS_X+8*(12+20),STATS_Y+24,s);
  1682.  
  1683.  
  1684.         if (tech_level>TECH_LEVEL_LOSS_START)
  1685.             tech_level-=(tech_level/TECH_LEVEL_LOSS);
  1686.         else
  1687.             tech_level+=TECH_LEVEL_UNAIDED;
  1688. // we can go over 100, but it's even more difficult
  1689.         if (tech_level>MAX_TECH_LEVEL)
  1690.             tech_level-=((tech_level-MAX_TECH_LEVEL)
  1691.                 /TECH_LEVEL_LOSS);
  1692.         sprintf(s,"%5.1f ",(float)tech_level*100.0/MAX_TECH_LEVEL);
  1693.         Fgl_write(STATS_X+(20+12)*8,STATS_Y,s);
  1694.  
  1695.                 sprintf(s,"%5d ",unnat_deaths);
  1696.                 Fgl_write(STATS_X+(20+12)*8,STATS_Y+8,s);
  1697.         deaths_cost+=unnat_deaths*UNNAT_DEATHS_COST;
  1698.  
  1699.             sprintf(s,"%2d/%2d",rockets_launched_success,rockets_launched);
  1700.             Fgl_write(STATS_X+(20+12)*8,STATS_Y+16,s);
  1701.  
  1702.         tpopulation=tstarving_population=tfood_in_markets
  1703.             =tjobs_in_markets=tcoal_in_markets=tgoods_in_markets
  1704.             =tore_in_markets=tsteel_in_markets
  1705.             =tunemployed_population=unnat_deaths=0;
  1706.     }    
  1707.     unemployed_population=0;
  1708.     if (total_time%NUMOF_DAYS_IN_YEAR==(NUMOF_DAYS_IN_YEAR-1))
  1709.     {
  1710.         income_tax=(income_tax*income_tax_rate)/100;
  1711.         if (income_tax>19999)
  1712.         {
  1713.             if (income_tax>1999999)
  1714.                 sprintf(s,"%4dM",income_tax/1000000);
  1715.             else
  1716.                 sprintf(s,"%4dK",income_tax/1000);
  1717.         }
  1718.         else
  1719.             sprintf(s,"%5d",income_tax);
  1720.         total_money+=income_tax;
  1721.         Fgl_write(FINANCE_X+2*8,FINANCE_Y+8,s);
  1722.  
  1723.         coal_tax=(coal_tax*coal_tax_rate)/100;
  1724.         if (coal_tax>19999)
  1725.         {
  1726.             if (coal_tax>1999999)
  1727.                 sprintf(s,"%4dM",coal_tax/1000000);
  1728.             else
  1729.                 sprintf(s,"%4dK",coal_tax/1000);
  1730.         }
  1731.         else
  1732.             sprintf(s,"%5d",coal_tax);
  1733.         total_money+=coal_tax;
  1734.         Fgl_write(FINANCE_X+2*8,FINANCE_Y+16,s);
  1735.  
  1736.                 goods_tax=(goods_tax*goods_tax_rate)/100;
  1737.                 if (goods_tax>19999)
  1738.                 {
  1739.                         if (goods_tax>1999999)
  1740.                                 sprintf(s,"%4dM",goods_tax/1000000);
  1741.                         else
  1742.                                 sprintf(s,"%4dK",goods_tax/1000);
  1743.                 }
  1744.                 else
  1745.                         sprintf(s,"%5d",goods_tax);
  1746.                 total_money+=goods_tax;
  1747.                 Fgl_write(FINANCE_X+2*8,FINANCE_Y+24,s);
  1748.  
  1749.                 if (export_tax>19999)
  1750.                 {
  1751.                         if (export_tax>1999999)
  1752.                                 sprintf(s,"%4dM",export_tax/1000000);
  1753.                         else
  1754.                                 sprintf(s,"%4dK",export_tax/1000);
  1755.                 }
  1756.                 else
  1757.                         sprintf(s,"%5d",export_tax);
  1758.                 total_money+=export_tax;
  1759.                 Fgl_write(FINANCE_X+2*8,FINANCE_Y+32,s);
  1760.         ly_university_cost=university_cost;
  1761.         ly_recycle_cost=recycle_cost;
  1762.         ly_deaths_cost=deaths_cost;
  1763.         ly_health_cost=(health_cost*(tech_level/10000)
  1764.             *HEALTH_RUNNING_COST_MUL)/(MAX_TECH_LEVEL/10000);
  1765.         ly_rocket_pad_cost=rocket_pad_cost;
  1766.         ly_school_cost=school_cost;
  1767.         ly_windmill_cost=windmill_cost;
  1768.         ly_fire_cost=(fire_cost*(tech_level/10000)
  1769.             *FIRESTATION_RUNNING_COST_MUL)
  1770.             /(MAX_TECH_LEVEL/10000);
  1771.         ly_cricket_cost=cricket_cost;
  1772.         if (total_money<0)
  1773.             ly_interest=(-total_money*INTEREST_RATE)/1000;
  1774.         else
  1775.             ly_interest=0;
  1776.         other_cost=university_cost+recycle_cost+deaths_cost
  1777.             +ly_health_cost+rocket_pad_cost+school_cost
  1778.             +ly_interest+windmill_cost+ly_fire_cost
  1779.             +ly_cricket_cost;
  1780.                 if (other_cost>19999)
  1781.                 {
  1782.                         if (other_cost>1999999)
  1783.                                 sprintf(s,"%4dM",other_cost/1000000);
  1784.                         else
  1785.                                 sprintf(s,"%4dK",other_cost/1000);
  1786.                 }
  1787.                 else
  1788.                         sprintf(s,"%5d",other_cost);
  1789.         total_money-=other_cost;
  1790.         Fgl_write(FINANCE_X+10*8,FINANCE_Y+8,s);
  1791.  
  1792.         unemployment_cost=(unemployment_cost*dole_rate)/100;
  1793.                 if (unemployment_cost>19999)
  1794.                 {
  1795.                         if (unemployment_cost>1999999)
  1796.                                 sprintf(s,"%4dM",unemployment_cost/1000000);
  1797.                         else
  1798.                                 sprintf(s,"%4dK",unemployment_cost/1000);
  1799.                 }
  1800.                 else
  1801.                         sprintf(s,"%5d",unemployment_cost);
  1802.         total_money-=unemployment_cost;
  1803.         Fgl_write(FINANCE_X+10*8,FINANCE_Y+16,s);
  1804.  
  1805.         transport_cost=(transport_cost*transport_cost_rate)/100;
  1806.                 if (transport_cost>19999)
  1807.                 {
  1808.                         if (transport_cost>1999999)
  1809.                                 sprintf(s,"%4dM",transport_cost/1000000);
  1810.                         else
  1811.                                 sprintf(s,"%4dK",transport_cost/1000);
  1812.                 }
  1813.                 else
  1814.                         sprintf(s,"%5d",transport_cost);
  1815.         total_money-=transport_cost;
  1816.         Fgl_write(FINANCE_X+10*8,FINANCE_Y+24,s);
  1817.  
  1818.                 import_cost=(import_cost*import_cost_rate)/100;
  1819.                 if (import_cost>19999)
  1820.                 {
  1821.                         if (import_cost>1999999)
  1822.                                 sprintf(s,"%4dM",import_cost/1000000);
  1823.                         else
  1824.                                 sprintf(s,"%4dK",import_cost/1000);
  1825.                 }
  1826.                 else
  1827.                         sprintf(s,"%5d",import_cost);
  1828.                 total_money-=import_cost;
  1829.                 Fgl_write(FINANCE_X+10*8,FINANCE_Y+32,s);
  1830.             income_tax=coal_tax=unemployment_cost=transport_cost
  1831.                     =goods_tax=export_tax=import_cost=windmill_cost
  1832.             =university_cost=recycle_cost=deaths_cost
  1833.             =health_cost=rocket_pad_cost=school_cost
  1834.             =fire_cost=cricket_cost=0;
  1835.  
  1836.         print_total_money();
  1837.     }
  1838.     redraw_mouse();
  1839. }
  1840.  
  1841. void print_total_money(void)
  1842. {
  1843.     char s[100],s2[100],i;
  1844.     if (total_money>2000000000)
  1845.         total_money=2000000000;
  1846.     else if (total_money<-2000000000)
  1847.         total_money=-2000000000;
  1848.     if (total_money/1000000 == 0)
  1849.         strcpy(s,"     ");
  1850.     else
  1851.         sprintf(s,"%5d",total_money/1000000);
  1852.     if ((total_money<0) && (total_money/1000000 !=0))
  1853.         sprintf(s2," %06d",-total_money%1000000);
  1854.     else if (total_money/1000000 !=0)
  1855.         sprintf(s2," %06d",total_money%1000000);
  1856.     else
  1857.             sprintf(s2,"%7d",total_money%1000000);
  1858.     strcat(s,s2);
  1859.     i=3;
  1860.     if (total_money<0)
  1861.         Fgl_setfontcolors(TEXT_BG_COLOUR,red(30));
  1862.         Fgl_write(FINANCE_X+i*8,FINANCE_Y+48,s);
  1863.     if (total_money<0)
  1864.         Fgl_setfontcolors(TEXT_BG_COLOUR,TEXT_FG_COLOUR);
  1865. }
  1866.  
  1867. void do_monthgraph(void)
  1868. {
  1869.     static int flag=0;
  1870.     int i;
  1871.     float f;
  1872.     if (flag==0)
  1873.     {
  1874.             Fgl_fillbox(MONTHGRAPH_X,MONTHGRAPH_Y,MONTHGRAPH_W+1
  1875.                     ,MONTHGRAPH_H+1,GRAPHS_B_COLOUR);
  1876.                 Fgl_fillbox(MAPPOINT_STATS_X
  1877.                         ,MAPPOINT_STATS_Y,MAPPOINT_STATS_W
  1878.                         ,MAPPOINT_STATS_H,GRAPHS_B_COLOUR);
  1879.         flag=1;
  1880. // draw borders
  1881.                 for (i=1;i<8;i++)
  1882.                 {
  1883. // pop graph
  1884.                         Fgl_hline(MONTHGRAPH_X-1-i,MONTHGRAPH_Y-1-i
  1885.                                 ,MONTHGRAPH_X+MONTHGRAPH_W+1+i
  1886.                                 ,yellow(16));
  1887.                         Fgl_line(MONTHGRAPH_X-1-i,MONTHGRAPH_Y-1-i
  1888.                                 ,MONTHGRAPH_X-1-i
  1889.                                 ,MONTHGRAPH_Y+MONTHGRAPH_H+1+i
  1890.                                 ,yellow(14));
  1891.                         Fgl_hline(MONTHGRAPH_X-1-i
  1892.                                 ,MONTHGRAPH_Y+MONTHGRAPH_H+1+i
  1893.                                 ,MONTHGRAPH_X+MONTHGRAPH_W+1+i
  1894.                                 ,yellow(22));
  1895.                         Fgl_line(MONTHGRAPH_X+MONTHGRAPH_W+1+i
  1896.                                 ,MONTHGRAPH_Y-1-i
  1897.                                 ,MONTHGRAPH_X+MONTHGRAPH_W+1+i
  1898.                                 ,MONTHGRAPH_Y+MONTHGRAPH_H+1+i
  1899.                                 ,yellow(24));
  1900. // diff graph
  1901.                         Fgl_hline(MAPPOINT_STATS_X-1-i,MAPPOINT_STATS_Y-1-i
  1902.                                 ,MAPPOINT_STATS_X+MAPPOINT_STATS_W+1+i
  1903.                                 ,yellow(16));
  1904.                         Fgl_line(MAPPOINT_STATS_X-1-i,MAPPOINT_STATS_Y-1-i
  1905.                                 ,MAPPOINT_STATS_X-1-i
  1906.                                 ,MAPPOINT_STATS_Y+MAPPOINT_STATS_H+1+i
  1907.                                 ,yellow(14));
  1908.                         Fgl_hline(MAPPOINT_STATS_X-1-i
  1909.                                 ,MAPPOINT_STATS_Y+MAPPOINT_STATS_H+1+i
  1910.                                 ,MAPPOINT_STATS_X+MAPPOINT_STATS_W+1+i
  1911.                                 ,yellow(22));
  1912.                         Fgl_line(MAPPOINT_STATS_X+MAPPOINT_STATS_W+1+i
  1913.                                 ,MAPPOINT_STATS_Y-1-i
  1914.                                 ,MAPPOINT_STATS_X+MAPPOINT_STATS_W+1+i
  1915.                                 ,MAPPOINT_STATS_Y+MAPPOINT_STATS_H+1+i
  1916.                                 ,yellow(24));
  1917.  
  1918.                 }
  1919.     }
  1920.     for (i=MONTHGRAPH_W-1;i>0;i--)
  1921.     {
  1922.         Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W-i
  1923.             ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_pop[i]
  1924.             ,GRAPHS_B_COLOUR);
  1925.         monthgraph_pop[i]=monthgraph_pop[i-1];
  1926.         Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W-i
  1927.             ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_pop[i],7);
  1928.  
  1929.                 Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W-i
  1930.                         ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_ppool[i]
  1931.                         ,GRAPHS_B_COLOUR);
  1932.                 monthgraph_ppool[i]=monthgraph_ppool[i-1];
  1933.                 Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W-i
  1934.                         ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_ppool[i]
  1935.                         ,cyan(24));
  1936.  
  1937.                 Fgl_line(MONTHGRAPH_X+MONTHGRAPH_W-i
  1938.             ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_nojobs[i]
  1939.             ,MONTHGRAPH_X+MONTHGRAPH_W-i
  1940.                         ,MONTHGRAPH_Y+MONTHGRAPH_H
  1941.                         ,GRAPHS_B_COLOUR);
  1942.                 monthgraph_nojobs[i]=monthgraph_nojobs[i-1];
  1943.                 Fgl_line(MONTHGRAPH_X+MONTHGRAPH_W-i
  1944.             ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_nojobs[i]
  1945.             ,MONTHGRAPH_X+MONTHGRAPH_W-i
  1946.                         ,MONTHGRAPH_Y+MONTHGRAPH_H
  1947.             ,yellow(24));
  1948.  
  1949.                 Fgl_line(MONTHGRAPH_X+MONTHGRAPH_W-i
  1950.                         ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_starve[i]
  1951.             ,MONTHGRAPH_X+MONTHGRAPH_W-i
  1952.             ,MONTHGRAPH_Y+MONTHGRAPH_H
  1953.                         ,GRAPHS_B_COLOUR);
  1954.                 monthgraph_starve[i]=monthgraph_starve[i-1];
  1955.                 Fgl_line(MONTHGRAPH_X+MONTHGRAPH_W-i
  1956.                         ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_starve[i]
  1957.             ,MONTHGRAPH_X+MONTHGRAPH_W-i
  1958.             ,MONTHGRAPH_Y+MONTHGRAPH_H
  1959.                         ,red(24));
  1960.  
  1961.  
  1962. // diff graph stuff. We can't draw it because the box might be used to 
  1963. // show the mappoint stats.
  1964.         diffgraph_power[i]=diffgraph_power[i-1];
  1965.         diffgraph_population[i]=diffgraph_population[i-1];
  1966.         diffgraph_coal[i]=diffgraph_coal[i-1];
  1967.         diffgraph_goods[i]=diffgraph_goods[i-1];
  1968.         diffgraph_ore[i]=diffgraph_ore[i-1];
  1969.     }
  1970.     if (tpopulation>0)
  1971.     {
  1972.         Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W
  1973.                 ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_pop[0],GRAPHS_B_COLOUR);
  1974.         Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W,MONTHGRAPH_Y
  1975.         +MONTHGRAPH_H-monthgraph_starve[0],GRAPHS_B_COLOUR);
  1976.         Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W
  1977.                 ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_nojobs[0]
  1978.         ,GRAPHS_B_COLOUR);
  1979.         Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W
  1980.                 ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_ppool[0]
  1981.         ,GRAPHS_B_COLOUR);
  1982.     monthgraph_pop[0]=((int)(log((tpopulation/NUMOF_DAYS_IN_MONTH)+1)
  1983.         *MONTHGRAPH_H/15))-5;
  1984.     if (monthgraph_pop[0]<0)
  1985.         monthgraph_pop[0]=0;
  1986.     f=((float)tstarving_population/((float)tpopulation+1.0))*100.0;
  1987.     if (tpopulation>3000)  // double the scale if pop > 3000
  1988.         f+=f;
  1989.     if (tpopulation>6000)  // double it AGAIN if pop > 6000
  1990.         f+=f;
  1991.     monthgraph_starve[0]=(int)f;
  1992. // max out at 32
  1993.     if (monthgraph_starve[0]>=MONTHGRAPH_H)
  1994.         monthgraph_starve[0]=MONTHGRAPH_H-1;
  1995.     f=((float)tunemployed_population/((float)tpopulation+1.0))*100.0;
  1996.         if (tpopulation>3000)  // double the scale if pop > 3000
  1997.                 f+=f;
  1998.         if (tpopulation>6000)  // double it AGAIN if pop > 6000
  1999.                 f+=f;
  2000.     monthgraph_nojobs[0]=(int)f;
  2001. // max out at 32 
  2002.     if(monthgraph_nojobs[0]>=MONTHGRAPH_H)
  2003.         monthgraph_nojobs[0]=MONTHGRAPH_H-1;
  2004.     monthgraph_ppool[0]=((int)(sqrt(people_pool+1)*MONTHGRAPH_H)/35);
  2005.     if (monthgraph_ppool[0]<0)
  2006.         monthgraph_ppool[0]=0;
  2007.     if (monthgraph_ppool[0]>=MONTHGRAPH_H)
  2008.         monthgraph_ppool[0]=MONTHGRAPH_H-1;
  2009.     Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W
  2010.         ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_pop[0],7);
  2011.     Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W
  2012.         ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_starve[0],red(24));
  2013.     Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W
  2014.         ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_nojobs[0],yellow(24));
  2015.     Fgl_setpixel(MONTHGRAPH_X+MONTHGRAPH_W
  2016.         ,MONTHGRAPH_Y+MONTHGRAPH_H-monthgraph_ppool[0],cyan(24));
  2017.     }
  2018. // diff graph new values
  2019.     i=(power_made-power_used)*4;
  2020.     power_made=power_used=0;
  2021.     if (i==0)
  2022.         diffgraph_power[0]=diffgraph_power[1]/2;
  2023.     else if (i<0)
  2024.     {
  2025.         if (i<-((MAPPOINT_STATS_H/4)-1))
  2026.             i=-((MAPPOINT_STATS_H/4)-1);
  2027.         diffgraph_power[0]=(i+diffgraph_power[1])/2;
  2028.     }
  2029.     else
  2030.     {
  2031.         if (i>(MAPPOINT_STATS_H/4)-1)
  2032.             i=(MAPPOINT_STATS_H/4)-1;
  2033.         diffgraph_power[0]=(i+diffgraph_power[1])/2;
  2034.     }
  2035.     i=(population-diff_old_population);
  2036.     diff_old_population=population;
  2037.     if (i==0)
  2038.         diffgraph_population[0]=diffgraph_population[1]/2;
  2039.     else if (i<0)
  2040.     {
  2041.         if (i<-((MAPPOINT_STATS_H/4)-1))
  2042.             i=-((MAPPOINT_STATS_H/4)-1);
  2043.         diffgraph_population[0]=(i+diffgraph_population[1])/2;
  2044.     }
  2045.     else
  2046.     {
  2047.         if (i>(MAPPOINT_STATS_H/4)-1)
  2048.             i=(MAPPOINT_STATS_H/4)-1;
  2049.         diffgraph_population[0]=(i+diffgraph_population[1])/2;
  2050.     }
  2051.     i=coal_made-coal_used;
  2052.     coal_made=coal_used=0;
  2053.     if (i==0)
  2054.         diffgraph_coal[0]=diffgraph_coal[1]/2;
  2055.     else if (i<0)
  2056.     {
  2057.         i=(int)(log(-i));
  2058.         if (i>(MAPPOINT_STATS_H/4)-1)
  2059.             i=(MAPPOINT_STATS_H/4)-1;
  2060.         diffgraph_coal[0]=(-i+diffgraph_coal[1])/2;
  2061.     }
  2062.     else
  2063.     {
  2064.         i=(int)(log(i));
  2065.         if (i>(MAPPOINT_STATS_H/4)-1)
  2066.             i=(MAPPOINT_STATS_H/4)-1;
  2067.         diffgraph_coal[0]=(i+diffgraph_coal[1])/2;
  2068.     }
  2069.     i=(goods_made-goods_used);
  2070.     goods_made=goods_used=0;
  2071.     if (i==0)
  2072.         diffgraph_goods[0]=diffgraph_goods[1]/2;
  2073.     else if (i<0)
  2074.     {
  2075.         i=(int)(log(-i));
  2076.         if (i>(MAPPOINT_STATS_H/4)-1)
  2077.             i=(MAPPOINT_STATS_H/4)-1;
  2078.         diffgraph_goods[0]=(-i+diffgraph_goods[1])/2;
  2079.     }
  2080.     else
  2081.     {
  2082.         i=(int)(log(i));
  2083.         if (i>(MAPPOINT_STATS_H/4)-1)
  2084.             i=(MAPPOINT_STATS_H/4)-1;
  2085.         diffgraph_goods[0]=(i+diffgraph_goods[1])/2;
  2086.     }
  2087.     i=(ore_made-ore_used)/2;
  2088.     ore_made=ore_used=0;
  2089.     if (i==0)
  2090.         diffgraph_ore[0]=diffgraph_ore[1]/2;
  2091.     else if (i<0)
  2092.     {
  2093.         i=(int)(log(-i));
  2094.         if (i>(MAPPOINT_STATS_H/4)-1)
  2095.             i=(MAPPOINT_STATS_H/4)-1;
  2096.         diffgraph_ore[0]=(-i+diffgraph_ore[1])/2;
  2097.     }
  2098.     else
  2099.     {
  2100.         i=(int)(log(i));
  2101.         if (i>(MAPPOINT_STATS_H/4)-1)
  2102.             i=(MAPPOINT_STATS_H/4)-1;
  2103.         diffgraph_ore[0]=(i+diffgraph_ore[1])/2;
  2104.     }
  2105. // now draw the graph if not used by mappoint stats
  2106.     if (mappoint_stats_flag==0)
  2107.         draw_diffgraph();
  2108. }
  2109.  
  2110. void draw_diffgraph(void)
  2111. {
  2112.     int i;
  2113.     // got to fill the whole box because we lost the old data
  2114.         Fgl_fillbox(MAPPOINT_STATS_X
  2115.                 ,MAPPOINT_STATS_Y,MAPPOINT_STATS_W+1
  2116.                 ,MAPPOINT_STATS_H+1,GRAPHS_B_COLOUR);
  2117.     for (i=MONTHGRAPH_W-1;i>=0;i--)
  2118.     {
  2119.         Fgl_setpixel(MAPPOINT_STATS_X+MAPPOINT_STATS_W-i
  2120.             ,(MAPPOINT_STATS_Y+(3*MAPPOINT_STATS_H)/4)
  2121.             -diffgraph_ore[i],DIFFGRAPH_ORE_COLOUR);
  2122.                 Fgl_setpixel(MAPPOINT_STATS_X+MAPPOINT_STATS_W-i
  2123.                         ,(MAPPOINT_STATS_Y+(3*MAPPOINT_STATS_H)/4)
  2124.                         -diffgraph_goods[i],DIFFGRAPH_GOODS_COLOUR);
  2125.                 Fgl_setpixel(MAPPOINT_STATS_X+MAPPOINT_STATS_W-i
  2126.                         ,(MAPPOINT_STATS_Y+(3*MAPPOINT_STATS_H)/4)
  2127.                         -diffgraph_coal[i],DIFFGRAPH_COAL_COLOUR);
  2128.                 Fgl_setpixel(MAPPOINT_STATS_X+MAPPOINT_STATS_W-i
  2129.                         ,(MAPPOINT_STATS_Y+MAPPOINT_STATS_H/4)
  2130.                         -diffgraph_population[i],DIFFGRAPH_POPULATION_COLOUR);
  2131.                 Fgl_setpixel(MAPPOINT_STATS_X+MAPPOINT_STATS_W-i
  2132.                         ,(MAPPOINT_STATS_Y+MAPPOINT_STATS_H/4)
  2133.                         -diffgraph_power[i],DIFFGRAPH_POWER_COLOUR);
  2134.  
  2135.     }
  2136.         // centre lines
  2137.         Fgl_hline(MAPPOINT_STATS_X
  2138.                 ,MAPPOINT_STATS_Y+MAPPOINT_STATS_H/4
  2139.                 ,MAPPOINT_STATS_X+MAPPOINT_STATS_W-1,white(22));
  2140.         Fgl_hline(MAPPOINT_STATS_X
  2141.                 ,MAPPOINT_STATS_Y+(3*MAPPOINT_STATS_H)/4
  2142.                 ,MAPPOINT_STATS_X+MAPPOINT_STATS_W-1,white(22));
  2143.         Fgl_hline(MAPPOINT_STATS_X
  2144.                 ,MAPPOINT_STATS_Y+MAPPOINT_STATS_H/2
  2145.                 ,MAPPOINT_STATS_X+MAPPOINT_STATS_W-1,0);
  2146. }
  2147.  
  2148. void clicked_market_cb(int x,int y)
  2149. {
  2150.     market_cb_flag=1;
  2151.     mcbx=x;
  2152.     mcby=y;
  2153. }
  2154.  
  2155. //void draw_market_cb(int x,int y)  // x & y are the market's pos.
  2156. void draw_market_cb(void)  // x & y are the market's pos.
  2157. {
  2158.     int x,y,flags;
  2159.     char s[100];
  2160. #ifdef LC_X11
  2161.     market_cb_drawn_flag=1;
  2162. #endif
  2163.     x=mcbx;
  2164.     y=mcby;
  2165.     flags=mappoint[x][y].flags;
  2166.     Fgl_getbox(MARKET_CB_X,MARKET_CB_Y,MARKET_CB_W,MARKET_CB_H
  2167.         ,market_cb_gbuf);
  2168.     Fgl_fillbox(MARKET_CB_X,MARKET_CB_Y,MARKET_CB_W,MARKET_CB_H,28);
  2169. #ifdef USE_EXPANDED_FONT
  2170.     gl_setwritemode(WRITEMODE_MASKED | FONT_EXPANDED);
  2171. #endif
  2172.     Fgl_write(MARKET_CB_X+6*8,MARKET_CB_Y+1,"Market");
  2173.     Fgl_write(MARKET_CB_X+7*8,MARKET_CB_Y+4*8,"FOOD");
  2174.     Fgl_write(MARKET_CB_X+7*8,MARKET_CB_Y+7*8,"JOBS");
  2175.     Fgl_write(MARKET_CB_X+7*8,MARKET_CB_Y+10*8,"COAL");
  2176.     Fgl_write(MARKET_CB_X+7*8+4,MARKET_CB_Y+13*8,"ORE");
  2177.     Fgl_write(MARKET_CB_X+6*8+4,MARKET_CB_Y+16*8,"GOODS");
  2178.     Fgl_write(MARKET_CB_X+6*8+4,MARKET_CB_Y+19*8,"STEEL");
  2179.     Fgl_write(MARKET_CB_X+12,MARKET_CB_Y+2*8,"Buy");
  2180.     Fgl_write(MARKET_CB_X+14*8,MARKET_CB_Y+2*8,"Sell");
  2181.     sprintf(s,"%3d",x);
  2182.     s[3]=',';
  2183.     s[4]=0; 
  2184.     Fgl_write(MARKET_CB_X+5*8+4,MARKET_CB_Y+2*8,s);
  2185.     sprintf(s,"%3d",y);
  2186.     Fgl_write(MARKET_CB_X+9*8+4,MARKET_CB_Y+2*8,s);
  2187. #ifdef USE_EXPANDED_FONT
  2188.     gl_setwritemode(WRITEMODE_OVERWRITE | FONT_EXPANDED);
  2189. #endif
  2190.     if ((flags & FLAG_MB_FOOD)!=0)
  2191.         Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+3*8+4,16,16
  2192.             ,checked_box_graphic);
  2193.     else
  2194.         Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+3*8+4,16,16
  2195.             ,unchecked_box_graphic);
  2196.     if ((flags & FLAG_MS_FOOD)!=0)
  2197.         Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+3*8+4,16,16
  2198.             ,checked_box_graphic);
  2199.     else
  2200.         Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+3*8+4,16,16
  2201.             ,unchecked_box_graphic);
  2202.  
  2203.     if ((flags & FLAG_MB_JOBS)!=0)
  2204.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+6*8+4,16,16
  2205.                         ,checked_box_graphic);
  2206.         else
  2207.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+6*8+4,16,16
  2208.                         ,unchecked_box_graphic);
  2209.         if ((flags & FLAG_MS_JOBS)!=0)
  2210.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+6*8+4,16,16
  2211.                         ,checked_box_graphic);
  2212.         else
  2213.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+6*8+4,16,16
  2214.                         ,unchecked_box_graphic);
  2215.  
  2216.         if ((flags & FLAG_MB_COAL)!=0)
  2217.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+9*8+4,16,16
  2218.                         ,checked_box_graphic);
  2219.         else
  2220.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+9*8+4,16,16
  2221.                         ,unchecked_box_graphic);
  2222.         if ((flags & FLAG_MS_COAL)!=0)
  2223.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+9*8+4,16,16
  2224.                         ,checked_box_graphic);
  2225.         else
  2226.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+9*8+4,16,16
  2227.                         ,unchecked_box_graphic);
  2228.  
  2229.         if ((flags & FLAG_MB_ORE)!=0)
  2230.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+12*8+4,16,16
  2231.                         ,checked_box_graphic);
  2232.         else
  2233.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+12*8+4,16,16
  2234.                         ,unchecked_box_graphic);
  2235.         if ((flags & FLAG_MS_ORE)!=0)
  2236.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+12*8+4,16,16
  2237.                         ,checked_box_graphic);
  2238.         else
  2239.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+12*8+4,16,16
  2240.                         ,unchecked_box_graphic);
  2241.  
  2242.         if ((flags & FLAG_MB_GOODS)!=0)
  2243.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+15*8+4,16,16
  2244.                         ,checked_box_graphic);
  2245.         else
  2246.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+15*8+4,16,16
  2247.                         ,unchecked_box_graphic);
  2248.         if ((flags & FLAG_MS_GOODS)!=0)
  2249.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+15*8+4,16,16
  2250.                         ,checked_box_graphic);
  2251.         else
  2252.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+15*8+4,16,16
  2253.                         ,unchecked_box_graphic);
  2254.  
  2255.         if ((flags & FLAG_MB_STEEL)!=0)
  2256.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+18*8+4,16,16
  2257.                         ,checked_box_graphic);
  2258.         else
  2259.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+18*8+4,16,16
  2260.                         ,unchecked_box_graphic);
  2261.         if ((flags & FLAG_MS_STEEL)!=0)
  2262.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+18*8+4,16,16
  2263.                         ,checked_box_graphic);
  2264.         else
  2265.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+18*8+4,16,16
  2266.                         ,unchecked_box_graphic);
  2267. }
  2268.  
  2269. void close_market_cb(void)
  2270. {
  2271.     market_cb_flag=0;
  2272. #ifdef LC_X11
  2273.     market_cb_drawn_flag=0;
  2274. #endif
  2275.     Fgl_putbox(MARKET_CB_X,MARKET_CB_Y,MARKET_CB_W,MARKET_CB_H
  2276.                 ,market_cb_gbuf);
  2277. // when exiting market cb, stop the mouse repeating straight away
  2278.         cs_mouse_button=MOUSE_LEFTBUTTON;
  2279.         cs_mouse_button_repeat=real_time+1000;
  2280.  
  2281. }
  2282.  
  2283.  
  2284. void clicked_port_cb(int x,int y)
  2285. {
  2286.     port_cb_flag=1;
  2287.     mcbx=x;
  2288.     mcby=y;
  2289. }
  2290.  
  2291. //void draw_port_cb(int x,int y)  // x & y are the market's pos.
  2292. void draw_port_cb(void)  // x & y are the market's pos.
  2293. {
  2294.     int x,y,flags;
  2295.     char s[100];
  2296. #ifdef LC_X11
  2297.     port_cb_drawn_flag=1;
  2298. #endif
  2299.     x=mcbx;
  2300.     y=mcby;
  2301.     flags=mappoint[x][y].flags;
  2302. // use the market cb resources where possible.
  2303.     Fgl_getbox(MARKET_CB_X,MARKET_CB_Y,MARKET_CB_W,MARKET_CB_H
  2304.         ,market_cb_gbuf);
  2305.     Fgl_fillbox(MARKET_CB_X,MARKET_CB_Y,MARKET_CB_W,MARKET_CB_H,28);
  2306. #ifdef USE_EXPANDED_FONT
  2307.     gl_setwritemode(WRITEMODE_MASKED | FONT_EXPANDED);
  2308. #endif
  2309.     Fgl_write(MARKET_CB_X+7*8,MARKET_CB_Y+1,"Port");
  2310.     Fgl_write(MARKET_CB_X+7*8,MARKET_CB_Y+7*8,"FOOD");
  2311.     Fgl_write(MARKET_CB_X+7*8,MARKET_CB_Y+10*8,"COAL");
  2312.     Fgl_write(MARKET_CB_X+7*8+4,MARKET_CB_Y+13*8,"ORE");
  2313.     Fgl_write(MARKET_CB_X+6*8+4,MARKET_CB_Y+16*8,"GOODS");
  2314.     Fgl_write(MARKET_CB_X+6*8+4,MARKET_CB_Y+19*8,"STEEL");
  2315.     Fgl_write(MARKET_CB_X+12,MARKET_CB_Y+2*8,"Buy");
  2316.     Fgl_write(MARKET_CB_X+14*8,MARKET_CB_Y+2*8,"Sell");
  2317.     sprintf(s,"%3d",x);
  2318.     s[3]=',';
  2319.     s[4]=0; 
  2320.     Fgl_write(MARKET_CB_X+5*8+4,MARKET_CB_Y+2*8,s);
  2321.     sprintf(s,"%3d",y);
  2322.     Fgl_write(MARKET_CB_X+9*8+4,MARKET_CB_Y+2*8,s);
  2323. #ifdef USE_EXPANDED_FONT
  2324.     gl_setwritemode(WRITEMODE_OVERWRITE | FONT_EXPANDED);
  2325. #endif
  2326.  
  2327.         if ((flags & FLAG_MB_FOOD)!=0)
  2328.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+6*8+4,16,16
  2329.                         ,checked_box_graphic);
  2330.         else
  2331.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+6*8+4,16,16
  2332.                         ,unchecked_box_graphic);
  2333.         if ((flags & FLAG_MS_FOOD)!=0)
  2334.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+6*8+4,16,16
  2335.                         ,checked_box_graphic);
  2336.         else
  2337.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+6*8+4,16,16
  2338.                         ,unchecked_box_graphic);
  2339.  
  2340.  
  2341.         if ((flags & FLAG_MB_COAL)!=0)
  2342.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+9*8+4,16,16
  2343.                         ,checked_box_graphic);
  2344.         else
  2345.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+9*8+4,16,16
  2346.                         ,unchecked_box_graphic);
  2347.         if ((flags & FLAG_MS_COAL)!=0)
  2348.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+9*8+4,16,16
  2349.                         ,checked_box_graphic);
  2350.         else
  2351.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+9*8+4,16,16
  2352.                         ,unchecked_box_graphic);
  2353.  
  2354.         if ((flags & FLAG_MB_ORE)!=0)
  2355.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+12*8+4,16,16
  2356.                         ,checked_box_graphic);
  2357.         else
  2358.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+12*8+4,16,16
  2359.                         ,unchecked_box_graphic);
  2360.         if ((flags & FLAG_MS_ORE)!=0)
  2361.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+12*8+4,16,16
  2362.                         ,checked_box_graphic);
  2363.         else
  2364.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+12*8+4,16,16
  2365.                         ,unchecked_box_graphic);
  2366.  
  2367.         if ((flags & FLAG_MB_GOODS)!=0)
  2368.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+15*8+4,16,16
  2369.                         ,checked_box_graphic);
  2370.         else
  2371.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+15*8+4,16,16
  2372.                         ,unchecked_box_graphic);
  2373.         if ((flags & FLAG_MS_GOODS)!=0)
  2374.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+15*8+4,16,16
  2375.                         ,checked_box_graphic);
  2376.         else
  2377.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+15*8+4,16,16
  2378.                         ,unchecked_box_graphic);
  2379.  
  2380.         if ((flags & FLAG_MB_STEEL)!=0)
  2381.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+18*8+4,16,16
  2382.                         ,checked_box_graphic);
  2383.         else
  2384.                 Fgl_putbox(MARKET_CB_X+2*8,MARKET_CB_Y+18*8+4,16,16
  2385.                         ,unchecked_box_graphic);
  2386.         if ((flags & FLAG_MS_STEEL)!=0)
  2387.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+18*8+4,16,16
  2388.                         ,checked_box_graphic);
  2389.         else
  2390.                 Fgl_putbox(MARKET_CB_X+14*8,MARKET_CB_Y+18*8+4,16,16
  2391.                         ,unchecked_box_graphic);
  2392. }
  2393.  
  2394. void close_port_cb(void)
  2395. {
  2396.     port_cb_flag=0;
  2397. #ifdef LC_X11
  2398.     port_cb_drawn_flag=0;
  2399. #endif
  2400.     Fgl_putbox(MARKET_CB_X,MARKET_CB_Y,MARKET_CB_W,MARKET_CB_H
  2401.                 ,market_cb_gbuf);
  2402. // when exiting port cb, stop the mouse repeating straight away
  2403.         cs_mouse_button=MOUSE_LEFTBUTTON;
  2404.         cs_mouse_button_repeat=real_time+1000;
  2405.  
  2406. }
  2407.  
  2408.  
  2409. int yn_dial_box(char *title,char *s1,char *s2,char *s3)
  2410. {
  2411.     int x,y,w,h,i;
  2412.     w=0;
  2413.     cs_mouse_button_delay=0;
  2414. // find len of longest string
  2415.     if (strlen(s1)>w)
  2416.         w=strlen(s1);
  2417.     if (strlen(s2)>w)
  2418.         w=strlen(s2);
  2419.     if (strlen(s3)>w)
  2420.         w=strlen(s3);
  2421.     w+=4;  // add a few spaces to the sides
  2422.     if (w<20)  // min width
  2423.         w=20;
  2424.     w*=8;  // convert chars to pixels
  2425.     x=(640/2)-(w/2);
  2426.     y=(480/2)-(8*9/2);
  2427.     h=9*8;
  2428.     char *ss = new char[(w+16)*(h+16)];
  2429.     hide_mouse();
  2430.     Fgl_getbox(x-8,y-8,w+16,h+16,ss);
  2431.     Fgl_fillbox(x,y,w,h,YN_DIALBOX_BG_COLOUR);
  2432.     for (i=1;i<8;i++)
  2433.     {
  2434.         Fgl_hline(x-i,y-i,x+w+i-1,YN_DIALBOX_BG_COLOUR+i+i);
  2435.         Fgl_hline(x-i,y+h+i-1,x+w+i-1,YN_DIALBOX_BG_COLOUR+i+i);
  2436.         Fgl_line(x-i,y-i,x-i,y+h+i-1,YN_DIALBOX_BG_COLOUR+i+i);
  2437.         Fgl_line(x+w+i-1,y-i,x+w+i-1,y+h+i-1,YN_DIALBOX_BG_COLOUR+i+i);
  2438.     }
  2439.     db_yesbox_x1=x+w/4-(2*8);
  2440.     db_yesbox_x2=db_yesbox_x1+4*8;
  2441.     db_yesbox_y1=(y+h-14-1);
  2442.     db_yesbox_y2=db_yesbox_y1+10+2;
  2443.     db_nobox_x1=x+((3*w)/4)-(2*8);
  2444.     db_nobox_x2=db_nobox_x1+4*8;
  2445.     db_nobox_y1=(y+h-14-1);
  2446.     db_nobox_y2=db_nobox_y1+10+2;
  2447.     Fgl_fillbox(db_yesbox_x1,db_yesbox_y1,4*8,10+2,white(0));
  2448.     Fgl_fillbox(db_nobox_x1,db_nobox_y1,4*8,10+2,white(0));
  2449.     Fgl_write(db_yesbox_x1+4,db_yesbox_y1+2,"YES");
  2450.     Fgl_write(db_nobox_x1+8,db_nobox_y1+2,"NO");
  2451. #ifdef USE_EXPANDED_FONT
  2452.     gl_setwritemode(WRITEMODE_MASKED | FONT_EXPANDED);
  2453. #else
  2454.     Fgl_setfontcolors(YN_DIALBOX_BG_COLOUR,TEXT_FG_COLOUR);
  2455. #endif
  2456.     Fgl_write((x+w/2)-(strlen(title)*4),y+4,title);
  2457.     Fgl_write((x+w/2)-(strlen(s1)*4),y+20,s1);
  2458.     Fgl_write((x+w/2)-(strlen(s2)*4),y+30,s2);
  2459.     Fgl_write((x+w/2)-(strlen(s3)*4),y+40,s3);
  2460. #ifdef USE_EXPANDED_FONT
  2461.     gl_setwritemode(WRITEMODE_OVERWRITE | FONT_EXPANDED);
  2462. #else
  2463.     Fgl_setfontcolors(TEXT_BG_COLOUR,TEXT_FG_COLOUR);
  2464. #endif
  2465.     redraw_mouse();
  2466.     db_flag=1;
  2467. // shake the mouse a bit to make sure we have the correct cursor.
  2468.     cs_mouse_handler(0,-1,0);
  2469.     cs_mouse_handler(0,1,0);
  2470.     db_yesbox_clicked=0;
  2471.     db_nobox_clicked=0;
  2472.     db_yesbox_clicked=0;
  2473.     db_nobox_clicked=0;
  2474.     do
  2475.     {
  2476.                 lc_usleep(1000); 
  2477.  
  2478. #ifdef LC_X11
  2479.         call_event();
  2480.         i=x_key_value;
  2481.         x_key_value=0;
  2482. #else
  2483.         mouse_update();
  2484.         i=vga_getkey();
  2485. #endif
  2486.         if (i==10 || i==13 || i==' ' || i=='y' || i=='Y')
  2487.             db_yesbox_clicked=1;
  2488.         else if (i=='n' || i==127 || i=='N')
  2489.             db_nobox_clicked=1;
  2490.     } while (db_yesbox_clicked==0 && db_nobox_clicked==0);
  2491.     db_flag=0;
  2492.     hide_mouse();
  2493.     Fgl_putbox(x-8,y-8,w+16,h+16,ss);
  2494.     redraw_mouse();
  2495. // shake the mouse a bit to make sure we have the correct cursor.
  2496.         cs_mouse_handler(0,-1,0);
  2497.         cs_mouse_handler(0,1,0);
  2498.  
  2499.     delete /* [(w+16)*(h+16)] */ ss;
  2500.  
  2501. // this flag is there to reset the mouse button, mouse_update() is not
  2502. // 'very' re-entrant, so I've got to clean it up after we get out of here.
  2503. // Yet another hack that I don't like! I need to get these dial boxes
  2504. // in the main loop!
  2505.     reset_mouse_flag=1;
  2506.     cs_mouse_button_repeat=real_time+1000;
  2507.     if (db_yesbox_clicked!=0)
  2508.         return(1);
  2509.     return(0);
  2510. }
  2511.  
  2512. void ok_dial_box(char *fn,int good_bad,char *xs)
  2513. {
  2514.     char s[100];
  2515.     int i,l,x,y,h,w,colour;
  2516.     FILE *inf;
  2517.     cs_mouse_button_delay=0;
  2518. // select which colour to draw the box in.
  2519.     if (suppress_ok_buttons!=0)
  2520.         return;
  2521.     if (good_bad==GOOD || good_bad==RESULTS)
  2522.         colour=green(14);
  2523.     else if (good_bad==BAD)
  2524.         colour=red(12);
  2525.     else
  2526.         colour=white(12);
  2527.     if (good_bad==RESULTS)
  2528.         strcpy(s,fn);
  2529.     else
  2530.     {
  2531.         strcpy(s,message_path);
  2532.         strcat(s,fn);
  2533.     }
  2534.     if ((inf=fopen(s,"r"))==NULL)
  2535.     {
  2536.         printf("Can't open message <%s> for OK dialog box\n",s);
  2537.  
  2538.  
  2539.         strcpy(s,message_path);
  2540.         strcat(s,"error.mes");
  2541.         if ((inf=fopen(s,"r"))==NULL)
  2542.         {
  2543.             fprintf(stderr
  2544.             ,"Can't open default message <%s> either\n",s); 
  2545.             fprintf(stderr," ...it was not displayed");
  2546.             return;
  2547.         }
  2548.     }
  2549. // static 74*22 char array for the message info array
  2550.     l=0;
  2551.     while (feof(inf)==0 && l<20)
  2552.     {
  2553.         if (fgets(okmessage[l],70,inf)==0)
  2554.             break;
  2555.         l++;
  2556.     }
  2557.     fclose(inf);
  2558.     if (xs!=0)
  2559.     {
  2560.         strncpy(okmessage[l],xs,70);
  2561.         l++;
  2562.     }
  2563. // 'l' is now the number of lines. Work out the height of the box.
  2564.     h=(l+3)*10;  // half a line above and below the title, 2 lines
  2565.             // for the ok button. 10 pixels per line
  2566.     w=0;
  2567. // Get rid of new line and work out the width of the logest line.
  2568.     for (i=0;i<l;i++)
  2569.     {
  2570. // get rid of the newline
  2571.             if (okmessage[i][strlen(okmessage[i])-1]==0xa)
  2572.                     okmessage[i][strlen(okmessage[i])-1]=0;
  2573.         if (strlen(okmessage[i])>w)
  2574.             w=strlen(okmessage[i]);
  2575.     }
  2576.     w=(w+2)*8; // leave a space at either side.
  2577. // now we can work out the x and y points.
  2578.     x=(640/2)-(w/2);
  2579.     y=(480/2)-(h/2);
  2580.     char *ss = new char[(w+16)*(h+16)];
  2581.     hide_mouse();
  2582.     Fgl_getbox(x-8,y-8,w+16,h+16,ss);
  2583.         Fgl_fillbox(x,y,w,h,colour);
  2584.         for (i=1;i<8;i++)
  2585.         {
  2586.                 Fgl_hline(x-i,y-i,x+w+i-1,colour+i+i);
  2587.                 Fgl_hline(x-i,y+h+i-1,x+w+i-1,colour+i+i);
  2588.                 Fgl_line(x-i,y-i,x-i,y+h+i-1,colour+i+i);
  2589.                 Fgl_line(x+w+i-1,y-i,x+w+i-1,y+h+i-1,colour+i+i);
  2590.         }
  2591.     db_okbox_x1=x+w/2-(2*8);
  2592.     db_okbox_x2=db_okbox_x1+4*8;
  2593.     db_okbox_y1=y+h-15;
  2594.     db_okbox_y2=db_okbox_y1+12;
  2595.     Fgl_fillbox(db_okbox_x1,db_okbox_y1,4*8,10+2,white(0));
  2596.     Fgl_write(db_okbox_x1+8,db_okbox_y1+2,"OK");
  2597. #ifdef USE_EXPANDED_FONT
  2598.     gl_setwritemode(WRITEMODE_MASKED | FONT_EXPANDED);
  2599. #else
  2600.     Fgl_setfontcolors(colour,TEXT_FG_COLOUR);
  2601. #endif
  2602.     Fgl_write((x+w/2)-(strlen(okmessage[0])*4),y+4,okmessage[0]);
  2603.     for (i=1;i<l;i++)
  2604.         Fgl_write((x+w/2)-(strlen(okmessage[i])*4)
  2605.             ,y+10+i*10,okmessage[i]);
  2606. #ifdef USE_EXPANDED_FONT
  2607.     gl_setwritemode(WRITEMODE_OVERWRITE | FONT_EXPANDED);
  2608. #else
  2609.     Fgl_setfontcolors(TEXT_BG_COLOUR,TEXT_FG_COLOUR);
  2610. #endif
  2611.     redraw_mouse();
  2612.     db_okflag=1;
  2613. // shake the mouse a bit to make sure we have the correct cursor.
  2614.         cs_mouse_handler(0,-1,0);
  2615.         cs_mouse_handler(0,1,0);
  2616.  
  2617. //    mouse_waitforupdate(); // dummy one to catch still pressed button
  2618. #ifdef LC_X11
  2619.         call_event();
  2620. #else
  2621.     mouse_update();
  2622. #endif
  2623.     db_okbox_clicked=0;
  2624.     cs_mouse_button=MOUSE_LEFTBUTTON;
  2625. //    mouse_waitforupdate();
  2626. #ifdef LC_X11
  2627.         call_event();
  2628. #else
  2629.     mouse_update();
  2630. #endif
  2631.     db_okbox_clicked=0;
  2632.     do
  2633.     {
  2634.                 lc_usleep(1000);
  2635.  
  2636. #ifdef LC_X11
  2637.             call_wait_event();
  2638.             i=x_key_value;
  2639.         x_key_value=0;
  2640. #else
  2641.         mouse_update();
  2642.         i=vga_getkey();
  2643. #endif
  2644.         if (i==10 || i==13 || i==' ')
  2645.             db_okbox_clicked=1;
  2646.     } while (db_okbox_clicked==0);
  2647.     db_okflag=0;
  2648.     hide_mouse();
  2649.     Fgl_putbox(x-8,y-8,w+16,h+16,ss);
  2650.     redraw_mouse();
  2651. // shake the mouse a bit to make sure we have the correct cursor.
  2652.         cs_mouse_handler(0,-1,0);
  2653.         cs_mouse_handler(0,1,0);
  2654.  
  2655.     delete /* [(w+16)*(h+16)] */ ss;
  2656. // when exiting dial box, stop the mouse repeating straight away
  2657.     reset_mouse_flag=1;
  2658.         cs_mouse_button_repeat=real_time+1000;
  2659. }
  2660.  
  2661. int inv_sbut(int button)
  2662. {
  2663.         int i,j;
  2664.         for (i=0;i<32;i++)    // just a test recode later
  2665.                 if (sbut[i]==button)
  2666.                 {
  2667.                         j=i;
  2668.                         break;
  2669.                 }
  2670.         return(j);
  2671. }
  2672.  
  2673.  
  2674. void call_select_change_up(int button)
  2675. {
  2676.     button=inv_sbut(button);
  2677.     if (button==GROUP_WINDMILL)
  2678.         ok_dial_box("windmillup.mes",GOOD,0L);
  2679.     else if (button==GROUP_POWER_SOURCE_COAL)
  2680.         ok_dial_box("coalpowerup.mes",GOOD,0L);
  2681.         else if (button==(GROUP_POWER_SOURCE-1))  // -1 a hack to make it
  2682.                     // work. Really dirty :(
  2683. // Caused by the fact that groups and buttons are different until after the
  2684. // bulldoze button, then they are the same.
  2685.                 ok_dial_box("solarpowerup.mes",GOOD,0L);
  2686.         else if (button==GROUP_COALMINE)
  2687.                 ok_dial_box("coalmineup.mes",GOOD,0L);
  2688.         else if (button==GROUP_RAIL)
  2689.                 ok_dial_box("railwayup.mes",GOOD,0L);
  2690.         else if (button==GROUP_ROAD)
  2691.                 ok_dial_box("roadup.mes",GOOD,0L);
  2692.         else if (button==GROUP_INDUSTRY_L)
  2693.                 ok_dial_box("ltindustryup.mes",GOOD,0L);
  2694.         else if (button==GROUP_UNIVERSITY)
  2695.                 ok_dial_box("universityup.mes",GOOD,0L);
  2696.         else if (button==GROUP_OREMINE)
  2697.     {
  2698.         if (GROUP_OREMINE_TECH>0)
  2699.                     ok_dial_box("oremineup.mes",GOOD,0L);
  2700.     }
  2701.         else if (button==GROUP_EX_PORT) // exports are the same
  2702.                 ok_dial_box("import-exportup.mes",GOOD,0L);
  2703.         else if (button==GROUP_INDUSTRY_H)
  2704.                 ok_dial_box("hvindustryup.mes",GOOD,0L);
  2705.         else if (button==GROUP_PARKLAND)
  2706.     {
  2707.             if (GROUP_PARKLAND_TECH>0)
  2708.                     ok_dial_box("parkup.mes",GOOD,0L);
  2709.     }
  2710.         else if (button==GROUP_RECYCLE)
  2711.                 ok_dial_box("recycleup.mes",GOOD,0L);
  2712.         else if (button==GROUP_RIVER)
  2713.     {
  2714.         if (GROUP_WATER_TECH>0)
  2715.                     ok_dial_box("riverup.mes",GOOD,0L);
  2716.     }
  2717.         else if (button==GROUP_HEALTH)
  2718.                 ok_dial_box("healthup.mes",GOOD,0L);
  2719.         else if (button==GROUP_ROCKET)
  2720.                 ok_dial_box("rocketup.mes",GOOD,0L);
  2721.     else if (button==GROUP_SCHOOL)
  2722.     {
  2723.         if (GROUP_SCHOOL_TECH>0)
  2724.             ok_dial_box("schoolup.mes",GOOD,0L);
  2725.     }
  2726.     else if (button==GROUP_BLACKSMITH)
  2727.     {
  2728.         if (GROUP_BLACKSMITH_TECH>0)
  2729.             ok_dial_box("blacksmithup.mes",GOOD,0L);
  2730.     }
  2731.     else if (button==GROUP_MILL)
  2732.     {
  2733.         if (GROUP_MILL_TECH>0)
  2734.             ok_dial_box("millup.mes",GOOD,0L);
  2735.     }
  2736.     else if (button==GROUP_POTTERY)
  2737.     {
  2738.         if (GROUP_POTTERY_TECH>0)
  2739.             ok_dial_box("potteryup.mes",GOOD,0L);
  2740.     }
  2741.     else if (button==GROUP_FIRESTATION)
  2742.         ok_dial_box("firestationup.mes",GOOD,0L);
  2743.     else if (button==GROUP_CRICKET)
  2744.         ok_dial_box("cricketup.mes",GOOD,0L);
  2745. }
  2746.  
  2747. // add spaces to the begining of the string.
  2748. void beg_space_pad(char *s,int l)
  2749. {
  2750.     char ss[100];
  2751.     int x,y;
  2752.     if ((x=strlen(s))>=l)
  2753.         return;
  2754.     x-=l;
  2755.     ss[0]=0;
  2756.     for (y=0;y<x;y++)
  2757.         strcat(ss," ");
  2758.     strcat(ss,s);
  2759.     strcpy(s,ss);
  2760. }
  2761.  
  2762. void draw_up_pbar(int x,int y,int val,int oldval)
  2763.         // offset is sqrt(val) - max = (PBAR_SIZE_Y/2)-8
  2764. {
  2765.     int offset,oldoffset;
  2766.     offset=(int)sqrt(val);
  2767.     if (offset>(PBAR_SIZE_Y/2)-8)
  2768.         offset=(PBAR_SIZE_Y/2)-8;
  2769.     oldoffset=(int)sqrt(oldval);
  2770.     if (oldoffset>(PBAR_SIZE_Y/2)-8)
  2771.         oldoffset=(PBAR_SIZE_Y/2)-8;
  2772.     if (offset==oldoffset)
  2773.         return;
  2774.     Fgl_enableclipping();
  2775.     Fgl_setclippingwindow(x+2,y+2,x+2+PBAR_SIZE_X
  2776.         ,y+2+(PBAR_SIZE_Y/2)-8);
  2777.     if (offset<oldoffset) // make sure no garbage left above new point
  2778.         Fgl_fillbox(x+2,y+2,PBAR_SIZE_X
  2779.             ,(PBAR_SIZE_Y/2)-6-offset,0);
  2780.     Fgl_putbox(x+2,y+2+(PBAR_SIZE_Y/2)-9-offset,16,16,up_pbar1_graphic);
  2781.     if (offset>15)
  2782.         Fgl_putbox(x+2,y+2+(PBAR_SIZE_Y/2)+7-offset
  2783.             ,16,16,up_pbar2_graphic);
  2784.     Fgl_disableclipping();
  2785. }
  2786.  
  2787. void draw_down_pbar(int x,int y,int val,int oldval)
  2788.                 // offset is sqrt(val) - max = (PBAR_SIZE_Y/2)-8
  2789. {
  2790.         int offset,oldoffset;
  2791.         offset=(int)sqrt(val);
  2792.         if (offset>(PBAR_SIZE_Y/2)-8)
  2793.                 offset=(PBAR_SIZE_Y/2)-8;
  2794.         oldoffset=(int)sqrt(oldval);
  2795.         if (oldoffset>(PBAR_SIZE_Y/2)-8)
  2796.                 oldoffset=(PBAR_SIZE_Y/2)-8;
  2797.         if (offset==oldoffset)
  2798.                 return;
  2799.         Fgl_enableclipping();
  2800.         Fgl_setclippingwindow(x+2,y+2+(PBAR_SIZE_Y/2)+8
  2801.         ,x+2+PBAR_SIZE_X,y+2+PBAR_SIZE_Y-2);
  2802.         if (offset<oldoffset) // make sure no garbage left above new point
  2803.                 Fgl_fillbox(x+2,y+2+(PBAR_SIZE_Y/2)+7+offset
  2804.             ,PBAR_SIZE_X,PBAR_SIZE_Y-(PBAR_SIZE_Y/2)-7,0);
  2805.         Fgl_putbox(x+2,y+2+(PBAR_SIZE_Y/2)-8+offset
  2806.         ,16,16,down_pbar1_graphic);
  2807.         if (offset>15)
  2808.                 Fgl_putbox(x+2,y+2+(PBAR_SIZE_Y/2)-24+offset
  2809.             ,16,16,down_pbar2_graphic);
  2810.     Fgl_disableclipping();
  2811. }
  2812.  
  2813. void do_pbar_population(int pop)
  2814. {
  2815.     static int flag=0;
  2816.     int i,tot=0,diff=0;
  2817.     if (flag==0)
  2818.     {
  2819.         flag=1;
  2820.         for (i=0;i<12;i++)  //  Don't think this is needed
  2821.             pbar_pops[i]=0;  //  Do it anyway.
  2822.         for (i=0;i<2;i++)
  2823.         {
  2824.             Fgl_hline(PBAR_POP_X+i,PBAR_POP_Y+i
  2825.                 ,PBAR_POP_X+(PBAR_SIZE_X+3)-i,yellow(12));
  2826.             Fgl_hline(PBAR_POP_X+i,PBAR_POP_Y+(PBAR_SIZE_Y+3)-i
  2827.                 ,PBAR_POP_X+(PBAR_SIZE_X+3)-i,yellow(24));
  2828.             Fgl_line(PBAR_POP_X+i,PBAR_POP_Y+1+i,PBAR_POP_X+i
  2829.                 ,PBAR_POP_Y+(PBAR_SIZE_Y+2)-i,yellow(14));
  2830.             Fgl_line(PBAR_POP_X+(PBAR_SIZE_X+3)-i,PBAR_POP_Y+1+i
  2831.                 ,PBAR_POP_X+(PBAR_SIZE_X+3)-i
  2832.                 ,PBAR_POP_Y+(PBAR_SIZE_Y+2)-i,yellow(22));
  2833.         }
  2834.         Fgl_fillbox(PBAR_POP_X+2,PBAR_POP_Y+2
  2835.             ,PBAR_SIZE_X,PBAR_SIZE_Y,0);
  2836.         Fgl_putbox(PBAR_POP_X+2,PBAR_POP_Y+(PBAR_SIZE_Y/2)-6
  2837.             ,16,16
  2838.             ,pop_pbar_graphic);
  2839.     }
  2840.     for (i=0;i<11;i++)               // go on, it's only 11 :)
  2841.         tot+=(pbar_pops[i]=pbar_pops[i+1]);
  2842.     tot+=(pbar_pops[11]=pop);
  2843.     diff=tot-pbar_pop_oldtot;
  2844.     if (diff>=0)
  2845.     {
  2846.         if (pbar_pop_olddiff<0)  // get rid of any -ve bar
  2847.         {
  2848.             Fgl_fillbox(PBAR_POP_X+2,PBAR_POP_Y+(PBAR_SIZE_Y/2)+8
  2849.                 ,PBAR_SIZE_X
  2850.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+8),0);
  2851.             pbar_pop_olddiff=0;
  2852.         }
  2853.         draw_up_pbar(PBAR_POP_X,PBAR_POP_Y,diff*2,pbar_pop_olddiff*2);
  2854.     }
  2855.     else
  2856.     {
  2857.         if (pbar_pop_olddiff>=0)  // get rid of any +ve bar
  2858.         {
  2859.             Fgl_fillbox(PBAR_POP_X+2,PBAR_POP_Y+2
  2860.                 ,PBAR_SIZE_X
  2861.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+7),0);
  2862.             pbar_pop_olddiff=0;
  2863.         }
  2864.         draw_down_pbar(PBAR_POP_X,PBAR_POP_Y,-diff*2
  2865.             ,-pbar_pop_olddiff*2);
  2866.     }
  2867.     pbar_pop_oldtot=tot;
  2868.     pbar_pop_olddiff=diff;
  2869. }
  2870.  
  2871. void do_pbar_tech(int tech)
  2872. {
  2873.         static int flag=0;
  2874.         int i,tot=0,diff=0;
  2875.         if (flag==0)
  2876.         {
  2877.                 flag=1;
  2878.                 for (i=0;i<12;i++)  //  Don't think this is needed
  2879.                         pbar_techs[i]=0;  //  Do it anyway.
  2880.                 for (i=0;i<2;i++)
  2881.                 {
  2882.             Fgl_hline(PBAR_TECH_X+i,PBAR_TECH_Y+i
  2883.                 ,PBAR_TECH_X+(PBAR_SIZE_X+3)-i,yellow(12));
  2884.             Fgl_hline(PBAR_TECH_X+i,PBAR_TECH_Y+(PBAR_SIZE_Y+3)-i
  2885.                 ,PBAR_TECH_X+(PBAR_SIZE_X+3)-i,yellow(24));
  2886.                         Fgl_line(PBAR_TECH_X+i,PBAR_TECH_Y+1+i,PBAR_TECH_X+i
  2887.                                 ,PBAR_TECH_Y+(PBAR_SIZE_Y+2)-i,yellow(14));
  2888.                         Fgl_line(PBAR_TECH_X+(PBAR_SIZE_X+3)-i
  2889.                 ,PBAR_TECH_Y+1+i
  2890.                 ,PBAR_TECH_X+(PBAR_SIZE_X+3)-i
  2891.                 ,PBAR_TECH_Y+(PBAR_SIZE_Y+2)-i,yellow(22));
  2892.         }
  2893.                 Fgl_fillbox(PBAR_TECH_X+2,PBAR_TECH_Y+2,PBAR_SIZE_X
  2894.             ,PBAR_SIZE_Y,0);
  2895.                 Fgl_putbox(PBAR_TECH_X+2,PBAR_TECH_Y+(PBAR_SIZE_Y/2)-6
  2896.             ,16,16,tech_pbar_graphic);
  2897.         }
  2898.         for (i=0;i<11;i++)               // go on, it's only 11 :)
  2899.                 tot+=(pbar_techs[i]=pbar_techs[i+1]);
  2900.         tot+=(pbar_techs[11]=tech/8);
  2901.         diff=tot-pbar_tech_oldtot;
  2902.         if (diff>=0)
  2903.         {
  2904.                 if (pbar_tech_olddiff<0)  // get rid of any -ve bar
  2905.                 {
  2906.                         Fgl_fillbox(PBAR_TECH_X+2
  2907.                 ,PBAR_TECH_Y+(PBAR_SIZE_Y/2)+8
  2908.                 ,PBAR_SIZE_X
  2909.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+8),0);
  2910.                         pbar_tech_olddiff=0;
  2911.                 }
  2912.                 draw_up_pbar(PBAR_TECH_X,PBAR_TECH_Y
  2913.             ,(diff/4)+1,(pbar_tech_olddiff/4)+1);
  2914.         }
  2915.         else
  2916.         {
  2917.                 if (pbar_tech_olddiff>=0)  // get rid of any +ve bar
  2918.                 {
  2919.                         Fgl_fillbox(PBAR_TECH_X+2,PBAR_TECH_Y+2
  2920.                 ,PBAR_SIZE_X
  2921.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+7),0);
  2922.                         pbar_tech_olddiff=0;
  2923.                 }
  2924.                 draw_down_pbar(PBAR_TECH_X,PBAR_TECH_Y
  2925.             ,(-diff/2)+1,(-pbar_tech_olddiff/2)+1);
  2926.         }
  2927.         pbar_tech_oldtot=tot;
  2928.         pbar_tech_olddiff=diff;
  2929. }
  2930.  
  2931. void do_pbar_food(int food)
  2932. {
  2933.         static int flag=0;
  2934.         int i,tot=0,diff=0;
  2935.         if (flag==0)
  2936.         {
  2937.                 flag=1;
  2938.                 for (i=0;i<12;i++)  //  Don't think this is needed
  2939.                         pbar_foods[i]=0;  //  Do it anyway.
  2940.                 for (i=0;i<2;i++)
  2941.                 {
  2942.             Fgl_hline(PBAR_FOOD_X+i,PBAR_FOOD_Y+i
  2943.                 ,PBAR_FOOD_X+(PBAR_SIZE_X+3)-i,yellow(12));
  2944.             Fgl_hline(PBAR_FOOD_X+i,PBAR_FOOD_Y+(PBAR_SIZE_Y+3)-i
  2945.                 ,PBAR_FOOD_X+(PBAR_SIZE_X+3)-i,yellow(24));
  2946.                         Fgl_line(PBAR_FOOD_X+i,PBAR_FOOD_Y+1+i,PBAR_FOOD_X+i
  2947.                                         ,PBAR_FOOD_Y+(PBAR_SIZE_Y+2)-i
  2948.                     ,yellow(14));
  2949.                         Fgl_line(PBAR_FOOD_X+(PBAR_SIZE_X+3)-i
  2950.                 ,PBAR_FOOD_Y+1+i
  2951.                 ,PBAR_FOOD_X+(PBAR_SIZE_X+3)-i
  2952.                 ,PBAR_FOOD_Y+(PBAR_SIZE_Y+2)-i
  2953.                 ,yellow(22));
  2954.         }
  2955.                 Fgl_fillbox(PBAR_FOOD_X+2,PBAR_FOOD_Y+2
  2956.             ,PBAR_SIZE_X,PBAR_SIZE_Y,0);
  2957.                 Fgl_putbox(PBAR_FOOD_X+2,PBAR_FOOD_Y+(PBAR_SIZE_Y/2)-6
  2958.             ,16,16,food_pbar_graphic);
  2959.         }
  2960.         for (i=0;i<11;i++)               // go on, it's only 11 :)
  2961.                 tot+=(pbar_foods[i]=pbar_foods[i+1]);
  2962.         tot+=(pbar_foods[11]=food);
  2963.         diff=tot-pbar_food_oldtot;
  2964.         if (diff>=0)
  2965.         {
  2966.                 if (pbar_food_olddiff<0)  // get rid of any -ve bar
  2967.                 {
  2968.             Fgl_fillbox(PBAR_FOOD_X+2,PBAR_FOOD_Y+(PBAR_SIZE_Y/2)+8
  2969.                 ,PBAR_SIZE_X
  2970.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+8),0);
  2971.                         pbar_food_olddiff=0;
  2972.                 }
  2973.                 draw_up_pbar(PBAR_FOOD_X,PBAR_FOOD_Y
  2974.             ,(diff/2)+1,(pbar_food_olddiff/2)+1);
  2975.         }
  2976.         else
  2977.         {
  2978.                 if (pbar_food_olddiff>=0)  // get rid of any +ve bar
  2979.                 {
  2980.                         Fgl_fillbox(PBAR_FOOD_X+2,PBAR_FOOD_Y+2
  2981.                 ,PBAR_SIZE_X
  2982.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+7),0);
  2983.                         pbar_food_olddiff=0;
  2984.                 }
  2985.                 draw_down_pbar(PBAR_FOOD_X,PBAR_FOOD_Y
  2986.             ,(-diff)+1,(-pbar_food_olddiff)+1);
  2987.         }
  2988.         pbar_food_oldtot=tot;
  2989.         pbar_food_olddiff=diff;
  2990. }
  2991.  
  2992. void do_pbar_jobs(int jobs)
  2993. {
  2994.         static int flag=0;
  2995.         int i,tot=0,diff=0;
  2996.         if (flag==0)
  2997.         {
  2998.                 flag=1;
  2999.                 for (i=0;i<12;i++)  //  Don't think this is needed
  3000.                         pbar_jobs[i]=0;  //  Do it anyway.
  3001.                 for (i=0;i<2;i++)
  3002.                 {
  3003.             Fgl_hline(PBAR_JOBS_X+i,PBAR_JOBS_Y+i
  3004.                 ,PBAR_JOBS_X+(PBAR_SIZE_X+3)-i,yellow(12));
  3005.             Fgl_hline(PBAR_JOBS_X+i,PBAR_JOBS_Y+(PBAR_SIZE_Y+3)-i
  3006.                 ,PBAR_JOBS_X+(PBAR_SIZE_X+3)-i,yellow(24));
  3007.                         Fgl_line(PBAR_JOBS_X+i,PBAR_JOBS_Y+1+i,PBAR_JOBS_X+i
  3008.                                         ,PBAR_JOBS_Y+(PBAR_SIZE_Y+2)-i
  3009.                     ,yellow(14));
  3010.                         Fgl_line(PBAR_JOBS_X+(PBAR_SIZE_X+3)-i
  3011.                 ,PBAR_JOBS_Y+1+i
  3012.                 ,PBAR_JOBS_X+(PBAR_SIZE_X+3)-i
  3013.                 ,PBAR_JOBS_Y+(PBAR_SIZE_Y+2)-i
  3014.                 ,yellow(22));
  3015.         }
  3016.                 Fgl_fillbox(PBAR_JOBS_X+2,PBAR_JOBS_Y+2
  3017.             ,PBAR_SIZE_X,PBAR_SIZE_Y,0);
  3018.                 Fgl_putbox(PBAR_JOBS_X+2,PBAR_JOBS_Y+(PBAR_SIZE_Y/2)-6
  3019.             ,16,16,jobs_pbar_graphic);
  3020.         }
  3021.         for (i=0;i<11;i++)               // go on, it's only 11 :)
  3022.                 tot+=(pbar_jobs[i]=pbar_jobs[i+1]);
  3023.         tot+=(pbar_jobs[11]=jobs);
  3024.         diff=tot-pbar_jobs_oldtot;
  3025.         if (diff>=0)
  3026.         {
  3027.                 if (pbar_jobs_olddiff<0)  // get rid of any -ve bar
  3028.                 {
  3029.             Fgl_fillbox(PBAR_JOBS_X+2,PBAR_JOBS_Y+(PBAR_SIZE_Y/2)+8
  3030.                 ,PBAR_SIZE_X
  3031.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+8),0);
  3032.                         pbar_jobs_olddiff=0;
  3033.                 }
  3034.                 draw_up_pbar(PBAR_JOBS_X,PBAR_JOBS_Y
  3035.             ,(diff/2)+1,(pbar_jobs_olddiff/2)+1);
  3036.         }
  3037.         else
  3038.         {
  3039.                 if (pbar_jobs_olddiff>=0)  // get rid of any +ve bar
  3040.                 {
  3041.                         Fgl_fillbox(PBAR_JOBS_X+2,PBAR_JOBS_Y+2
  3042.                 ,PBAR_SIZE_X
  3043.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+7),0);
  3044.                         pbar_jobs_olddiff=0;
  3045.                 }
  3046.                 draw_down_pbar(PBAR_JOBS_X,PBAR_JOBS_Y
  3047.             ,(-diff)+1,(-pbar_jobs_olddiff)+1);
  3048.         }
  3049.         pbar_jobs_oldtot=tot;
  3050.         pbar_jobs_olddiff=diff;
  3051. }
  3052.  
  3053. void do_pbar_coal(int coal)
  3054. {
  3055.         static int flag=0;
  3056.         int i,tot=0,diff=0;
  3057.         if (flag==0)
  3058.         {
  3059.                 flag=1;
  3060.                 for (i=0;i<12;i++)  //  Don't think this is needed
  3061.                         pbar_coal[i]=0;  //  Do it anyway.
  3062.                 for (i=0;i<2;i++)
  3063.                 {
  3064.             Fgl_hline(PBAR_COAL_X+i,PBAR_COAL_Y+i
  3065.                 ,PBAR_COAL_X+(PBAR_SIZE_X+3)-i,yellow(12));
  3066.             Fgl_hline(PBAR_COAL_X+i,PBAR_COAL_Y+(PBAR_SIZE_Y+3)-i
  3067.                 ,PBAR_COAL_X+(PBAR_SIZE_X+3)-i,yellow(24));
  3068.                         Fgl_line(PBAR_COAL_X+i,PBAR_COAL_Y+1+i,PBAR_COAL_X+i
  3069.                                         ,PBAR_COAL_Y+(PBAR_SIZE_Y+2)-i
  3070.                     ,yellow(14));
  3071.                         Fgl_line(PBAR_COAL_X+(PBAR_SIZE_X+3)-i
  3072.                 ,PBAR_COAL_Y+1+i
  3073.                 ,PBAR_COAL_X+(PBAR_SIZE_X+3)-i
  3074.                 ,PBAR_COAL_Y+(PBAR_SIZE_Y+2)-i
  3075.                 ,yellow(22));
  3076.         }
  3077.                 Fgl_fillbox(PBAR_COAL_X+2,PBAR_COAL_Y+2
  3078.             ,PBAR_SIZE_X,PBAR_SIZE_Y,0);
  3079.                 Fgl_putbox(PBAR_COAL_X+2,PBAR_COAL_Y+(PBAR_SIZE_Y/2)-6
  3080.             ,16,16,coal_pbar_graphic);
  3081.         }
  3082.         for (i=0;i<11;i++)               // go on, it's only 11 :)
  3083.                 tot+=(pbar_coal[i]=pbar_coal[i+1]);
  3084.         tot+=(pbar_coal[11]=coal);
  3085.         diff=tot-pbar_coal_oldtot;
  3086.         if (diff>=0)
  3087.         {
  3088.                 if (pbar_coal_olddiff<0)  // get rid of any -ve bar
  3089.                 {
  3090.             Fgl_fillbox(PBAR_COAL_X+2,PBAR_COAL_Y+(PBAR_SIZE_Y/2)+8
  3091.                 ,PBAR_SIZE_X
  3092.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+8),0);
  3093.                         pbar_coal_olddiff=0;
  3094.                 }
  3095.                 draw_up_pbar(PBAR_COAL_X,PBAR_COAL_Y
  3096.             ,(diff/2)+1,(pbar_coal_olddiff/2)+1);
  3097.         }
  3098.         else
  3099.         {
  3100.                 if (pbar_coal_olddiff>=0)  // get rid of any +ve bar
  3101.                 {
  3102.                         Fgl_fillbox(PBAR_COAL_X+2,PBAR_COAL_Y+2
  3103.                 ,PBAR_SIZE_X
  3104.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+7),0);
  3105.                         pbar_coal_olddiff=0;
  3106.                 }
  3107.                 draw_down_pbar(PBAR_COAL_X,PBAR_COAL_Y
  3108.             ,(-diff)+1,(-pbar_coal_olddiff)+1);
  3109.         }
  3110.         pbar_coal_oldtot=tot;
  3111.         pbar_coal_olddiff=diff;
  3112. }
  3113.  
  3114. void do_pbar_goods(int goods)
  3115. {
  3116.         static int flag=0;
  3117.         int i,tot=0,diff=0;
  3118.         if (flag==0)
  3119.         {
  3120.                 flag=1;
  3121.                 for (i=0;i<12;i++)  //  Don't think this is needed
  3122.                         pbar_goods[i]=0;  //  Do it anyway.
  3123.                 for (i=0;i<2;i++)
  3124.                 {
  3125.             Fgl_hline(PBAR_GOODS_X+i,PBAR_GOODS_Y+i
  3126.                 ,PBAR_GOODS_X+(PBAR_SIZE_X+3)-i,yellow(12));
  3127.             Fgl_hline(PBAR_GOODS_X+i
  3128.                 ,PBAR_GOODS_Y+(PBAR_SIZE_Y+3)-i
  3129.                 ,PBAR_GOODS_X+(PBAR_SIZE_X+3)-i,yellow(24));
  3130.                         Fgl_line(PBAR_GOODS_X+i
  3131.                 ,PBAR_GOODS_Y+1+i,PBAR_GOODS_X+i
  3132.                                 ,PBAR_GOODS_Y+(PBAR_SIZE_Y+2)-i
  3133.                 ,yellow(14));
  3134.                         Fgl_line(PBAR_GOODS_X+(PBAR_SIZE_X+3)-i
  3135.                 ,PBAR_GOODS_Y+1+i
  3136.                 ,PBAR_GOODS_X+(PBAR_SIZE_X+3)-i
  3137.                 ,PBAR_GOODS_Y+(PBAR_SIZE_Y+2)-i
  3138.                 ,yellow(22));
  3139.         }
  3140.                 Fgl_fillbox(PBAR_GOODS_X+2,PBAR_GOODS_Y+2
  3141.             ,PBAR_SIZE_X,PBAR_SIZE_Y,0);
  3142.                 Fgl_putbox(PBAR_GOODS_X+2,PBAR_GOODS_Y+(PBAR_SIZE_Y/2)-6
  3143.             ,16,16,goods_pbar_graphic);
  3144.         }
  3145.         for (i=0;i<11;i++)               // go on, it's only 11 :)
  3146.                 tot+=(pbar_goods[i]=pbar_goods[i+1]);
  3147.         tot+=(pbar_goods[11]=goods);
  3148.         diff=tot-pbar_goods_oldtot;
  3149.         if (diff>=0)
  3150.         {
  3151.                 if (pbar_goods_olddiff<0)  // get rid of any -ve bar
  3152.                 {
  3153.             Fgl_fillbox(PBAR_GOODS_X+2
  3154.                 ,PBAR_GOODS_Y+(PBAR_SIZE_Y/2)+8
  3155.                 ,PBAR_SIZE_X
  3156.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+8),0);
  3157.                         pbar_goods_olddiff=0;
  3158.                 }
  3159.                 draw_up_pbar(PBAR_GOODS_X,PBAR_GOODS_Y
  3160.             ,(diff/2)+1,(pbar_goods_olddiff/2)+1);
  3161.         }
  3162.         else
  3163.         {
  3164.                 if (pbar_goods_olddiff>=0)  // get rid of any +ve bar
  3165.                 {
  3166.                         Fgl_fillbox(PBAR_GOODS_X+2,PBAR_GOODS_Y+2
  3167.                 ,PBAR_SIZE_X
  3168.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+7),0);
  3169.                         pbar_goods_olddiff=0;
  3170.                 }
  3171.                 draw_down_pbar(PBAR_GOODS_X,PBAR_GOODS_Y
  3172.             ,(-diff)+1,(-pbar_goods_olddiff)+1);
  3173.         }
  3174.         pbar_goods_oldtot=tot;
  3175.         pbar_goods_olddiff=diff;
  3176. }
  3177.  
  3178. void do_pbar_ore(int ore)
  3179. {
  3180.         static int flag=0;
  3181.         int i,tot=0,diff=0;
  3182.         if (flag==0)
  3183.         {
  3184.                 flag=1;
  3185.                 for (i=0;i<12;i++)  //  Don't think this is needed
  3186.                         pbar_ore[i]=0;  //  Do it anyway.
  3187.                 for (i=0;i<2;i++)
  3188.                 {
  3189.             Fgl_hline(PBAR_ORE_X+i,PBAR_ORE_Y+i
  3190.                 ,PBAR_ORE_X+(PBAR_SIZE_X+3)-i,yellow(12));
  3191.             Fgl_hline(PBAR_ORE_X+i
  3192.                 ,PBAR_ORE_Y+(PBAR_SIZE_Y+3)-i
  3193.                 ,PBAR_ORE_X+(PBAR_SIZE_X+3)-i,yellow(24));
  3194.                         Fgl_line(PBAR_ORE_X+i
  3195.                 ,PBAR_ORE_Y+1+i,PBAR_ORE_X+i
  3196.                                 ,PBAR_ORE_Y+(PBAR_SIZE_Y+2)-i
  3197.                 ,yellow(14));
  3198.                         Fgl_line(PBAR_ORE_X+(PBAR_SIZE_X+3)-i
  3199.                 ,PBAR_ORE_Y+1+i
  3200.                 ,PBAR_ORE_X+(PBAR_SIZE_X+3)-i
  3201.                 ,PBAR_ORE_Y+(PBAR_SIZE_Y+2)-i
  3202.                 ,yellow(22));
  3203.         }
  3204.                 Fgl_fillbox(PBAR_ORE_X+2,PBAR_ORE_Y+2
  3205.             ,PBAR_SIZE_X,PBAR_SIZE_Y,0);
  3206.                 Fgl_putbox(PBAR_ORE_X+2,PBAR_ORE_Y+(PBAR_SIZE_Y/2)-6
  3207.             ,16,16,ore_pbar_graphic);
  3208.         }
  3209.         for (i=0;i<11;i++)               // go on, it's only 11 :)
  3210.                 tot+=(pbar_ore[i]=pbar_ore[i+1]);
  3211.         tot+=(pbar_ore[11]=ore);
  3212.         diff=tot-pbar_ore_oldtot;
  3213.         if (diff>=0)
  3214.         {
  3215.                 if (pbar_ore_olddiff<0)  // get rid of any -ve bar
  3216.                 {
  3217.             Fgl_fillbox(PBAR_ORE_X+2
  3218.                 ,PBAR_ORE_Y+(PBAR_SIZE_Y/2)+8
  3219.                 ,PBAR_SIZE_X
  3220.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+8),0);
  3221.                         pbar_ore_olddiff=0;
  3222.                 }
  3223.                 draw_up_pbar(PBAR_ORE_X,PBAR_ORE_Y
  3224.             ,(diff/2)+1,(pbar_ore_olddiff/2)+1);
  3225.         }
  3226.         else
  3227.         {
  3228.                 if (pbar_ore_olddiff>=0)  // get rid of any +ve bar
  3229.                 {
  3230.                         Fgl_fillbox(PBAR_ORE_X+2,PBAR_ORE_Y+2
  3231.                 ,PBAR_SIZE_X
  3232.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+7),0);
  3233.                         pbar_ore_olddiff=0;
  3234.                 }
  3235.                 draw_down_pbar(PBAR_ORE_X,PBAR_ORE_Y
  3236.             ,(-diff)+1,(-pbar_ore_olddiff)+1);
  3237.         }
  3238.         pbar_ore_oldtot=tot;
  3239.         pbar_ore_olddiff=diff;
  3240. }
  3241.  
  3242. void do_pbar_steel(int steel)
  3243. {
  3244.         static int flag=0;
  3245.         int i,tot=0,diff=0;
  3246.         if (flag==0)
  3247.         {
  3248.                 flag=1;
  3249.                 for (i=0;i<12;i++)  //  Don't think this is needed
  3250.                         pbar_steel[i]=0;  //  Do it anyway.
  3251.                 for (i=0;i<2;i++)
  3252.                 {
  3253.             Fgl_hline(PBAR_STEEL_X+i,PBAR_STEEL_Y+i
  3254.                 ,PBAR_STEEL_X+(PBAR_SIZE_X+3)-i,yellow(12));
  3255.             Fgl_hline(PBAR_STEEL_X+i
  3256.                 ,PBAR_STEEL_Y+(PBAR_SIZE_Y+3)-i
  3257.                 ,PBAR_STEEL_X+(PBAR_SIZE_X+3)-i,yellow(24));
  3258.                         Fgl_line(PBAR_STEEL_X+i
  3259.                 ,PBAR_STEEL_Y+1+i,PBAR_STEEL_X+i
  3260.                                 ,PBAR_STEEL_Y+(PBAR_SIZE_Y+2)-i
  3261.                 ,yellow(14));
  3262.                         Fgl_line(PBAR_STEEL_X+(PBAR_SIZE_X+3)-i
  3263.                 ,PBAR_STEEL_Y+1+i
  3264.                 ,PBAR_STEEL_X+(PBAR_SIZE_X+3)-i
  3265.                 ,PBAR_STEEL_Y+(PBAR_SIZE_Y+2)-i
  3266.                 ,yellow(22));
  3267.         }
  3268.                 Fgl_fillbox(PBAR_STEEL_X+2,PBAR_STEEL_Y+2
  3269.             ,PBAR_SIZE_X,PBAR_SIZE_Y,0);
  3270.                 Fgl_putbox(PBAR_STEEL_X+2,PBAR_STEEL_Y+(PBAR_SIZE_Y/2)-6
  3271.             ,16,16,steel_pbar_graphic);
  3272.         }
  3273.         for (i=0;i<11;i++)               // go on, it's only 11 :)
  3274.                 tot+=(pbar_steel[i]=pbar_steel[i+1]);
  3275.         tot+=(pbar_steel[11]=steel);
  3276.         diff=tot-pbar_steel_oldtot;
  3277.         if (diff>=0)
  3278.         {
  3279.                 if (pbar_steel_olddiff<0)  // get rid of any -ve bar
  3280.                 {
  3281.             Fgl_fillbox(PBAR_STEEL_X+2
  3282.                 ,PBAR_STEEL_Y+(PBAR_SIZE_Y/2)+8
  3283.                 ,PBAR_SIZE_X
  3284.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+8),0);
  3285.                         pbar_steel_olddiff=0;
  3286.                 }
  3287.                 draw_up_pbar(PBAR_STEEL_X,PBAR_STEEL_Y
  3288.             ,(diff/2)+1,(pbar_steel_olddiff/2)+1);
  3289.         }
  3290.         else
  3291.         {
  3292.                 if (pbar_steel_olddiff>=0)  // get rid of any +ve bar
  3293.                 {
  3294.                         Fgl_fillbox(PBAR_STEEL_X+2,PBAR_STEEL_Y+2
  3295.                 ,PBAR_SIZE_X
  3296.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+7),0);
  3297.                         pbar_steel_olddiff=0;
  3298.                 }
  3299.                 draw_down_pbar(PBAR_STEEL_X,PBAR_STEEL_Y
  3300.             ,(-diff)+1,(-pbar_steel_olddiff)+1);
  3301.         }
  3302.         pbar_steel_oldtot=tot;
  3303.         pbar_steel_olddiff=diff;
  3304. }
  3305.  
  3306.  
  3307. void do_pbar_money(int money)
  3308. {
  3309.         static int flag=0;
  3310.         int i,tot=0,diff=0;
  3311.         if (flag==0)
  3312.         {
  3313.                 flag=1;
  3314.                 for (i=0;i<12;i++)  //  Don't think this is needed
  3315.                         pbar_money[i]=0;  //  Do it anyway.
  3316.                 for (i=0;i<2;i++)
  3317.                 {
  3318.             Fgl_hline(PBAR_MONEY_X+i,PBAR_MONEY_Y+i
  3319.                 ,PBAR_MONEY_X+(PBAR_SIZE_X+3)-i,yellow(12));
  3320.             Fgl_hline(PBAR_MONEY_X+i,PBAR_MONEY_Y
  3321.                 +(PBAR_SIZE_Y+3)-i
  3322.                 ,PBAR_MONEY_X+(PBAR_SIZE_X+3)-i,yellow(24));
  3323.                         Fgl_line(PBAR_MONEY_X+i,PBAR_MONEY_Y+1+i
  3324.                 ,PBAR_MONEY_X+i
  3325.                                 ,PBAR_MONEY_Y+(PBAR_SIZE_Y+2)-i
  3326.                 ,yellow(14));
  3327.                         Fgl_line(PBAR_MONEY_X+(PBAR_SIZE_X+3)-i
  3328.                 ,PBAR_MONEY_Y+1+i
  3329.                 ,PBAR_MONEY_X+(PBAR_SIZE_X+3)-i
  3330.                 ,PBAR_MONEY_Y+(PBAR_SIZE_Y+2)-i
  3331.                 ,yellow(22));
  3332.         }
  3333.                 Fgl_fillbox(PBAR_MONEY_X+2,PBAR_MONEY_Y+2
  3334.             ,PBAR_SIZE_X,PBAR_SIZE_Y,0);
  3335.                 Fgl_putbox(PBAR_MONEY_X+2,PBAR_MONEY_Y+(PBAR_SIZE_Y/2)-6
  3336.             ,16,16,money_pbar_graphic);
  3337.         }
  3338.         for (i=0;i<11;i++)               // go on, it's only 11 :)
  3339.                 tot+=(pbar_money[i]=pbar_money[i+1]);
  3340.         tot+=(pbar_money[11]=money);
  3341.         diff=tot-pbar_money_oldtot;
  3342.         if (diff>=0)
  3343.         {
  3344.                 if (pbar_money_olddiff<0)  // get rid of any -ve bar
  3345.                 {
  3346.             Fgl_fillbox(PBAR_MONEY_X+2,PBAR_MONEY_Y
  3347.                 +(PBAR_SIZE_Y/2)+8,PBAR_SIZE_X
  3348.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+8),0);
  3349.                         pbar_money_olddiff=0;
  3350.                 }
  3351.                 draw_up_pbar(PBAR_MONEY_X,PBAR_MONEY_Y
  3352.             ,(diff/2)+1,(pbar_money_olddiff/2)+1);
  3353.         }
  3354.         else
  3355.         {
  3356.                 if (pbar_money_olddiff>=0)  // get rid of any +ve bar
  3357.                 {
  3358.                         Fgl_fillbox(PBAR_MONEY_X+2,PBAR_MONEY_Y+2
  3359.                 ,PBAR_SIZE_X
  3360.                 ,PBAR_SIZE_Y-((PBAR_SIZE_Y/2)+7),0);
  3361.                         pbar_money_olddiff=0;
  3362.                 }
  3363.                 draw_down_pbar(PBAR_MONEY_X,PBAR_MONEY_Y
  3364.             ,(-diff)+1,(-pbar_money_olddiff)+1);
  3365.         }
  3366.         pbar_money_oldtot=tot;
  3367.         pbar_money_olddiff=diff;
  3368. }
  3369.  
  3370.  
  3371. void prog_box(char *title,int percent)
  3372. {
  3373.     static int flag=0,oldpercent=0;
  3374.     char s[100];
  3375.     int i;
  3376.     if (flag==0)
  3377.     {
  3378.         hide_mouse();
  3379.         Fgl_getbox(PROGBOXX-8,PROGBOXY-8,PROGBOXW+16
  3380.             ,PROGBOXH+16,progbox);
  3381.         Fgl_fillbox(PROGBOXX,PROGBOXY
  3382.             ,PROGBOXW,PROGBOXH,PROGBOX_BG_COLOUR);
  3383.                 for (i=1;i<8;i++)
  3384.                 {
  3385.                         Fgl_hline(PROGBOXX-i,PROGBOXY-i
  3386.                                 ,PROGBOXX+PROGBOXW+i-1
  3387.                                 ,PROGBOX_BG_COLOUR+i+i);
  3388.                         Fgl_hline(PROGBOXX-i,PROGBOXY+PROGBOXH+i-1
  3389.                                 ,PROGBOXX+PROGBOXW+i-1
  3390.                                 ,PROGBOX_BG_COLOUR+i+i);
  3391.                         Fgl_line(PROGBOXX-i,PROGBOXY-i
  3392.                                 ,PROGBOXX-i,PROGBOXY+PROGBOXH+i-1
  3393.                                 ,PROGBOX_BG_COLOUR+i+i);
  3394.                         Fgl_line(PROGBOXX+PROGBOXW+i-1,PROGBOXY-i
  3395.                                 ,PROGBOXX+PROGBOXW+i-1
  3396.                                 ,PROGBOXY+PROGBOXH+i-1
  3397.                                 ,PROGBOX_BG_COLOUR+i+i);
  3398.                 }
  3399.  
  3400.  
  3401.         Fgl_setfontcolors(PROGBOX_BG_COLOUR,TEXT_FG_COLOUR);
  3402.         Fgl_write((PROGBOXX+PROGBOXW/2)
  3403.             -(strlen(title)*4),PROGBOXY+8,title);
  3404.         Fgl_setfontcolors(TEXT_BG_COLOUR,TEXT_FG_COLOUR);
  3405.  
  3406.         flag=1;
  3407.     }
  3408.     if (percent!=oldpercent)
  3409.     {
  3410.         Fgl_fillbox(PROGBOXX+20,PROGBOXY+60
  3411.             ,((PROGBOXW-40)*percent)/100
  3412.             ,20,PROGBOX_DONE_COL);
  3413.         Fgl_fillbox(PROGBOXX+20+(((PROGBOXW-40)*percent)/100)
  3414.             ,PROGBOXY+60
  3415.             ,PROGBOXW-40-(((PROGBOXW-40)*percent)/100)
  3416.             ,20,PROGBOX_NOTDONE_COL);
  3417.         oldpercent=percent;
  3418.         Fgl_fillbox(PROGBOXX+(PROGBOXW/2)-20
  3419.             ,PROGBOXY+24,40,16,PROGBOX_BG_COLOUR);
  3420.         sprintf(s,"%3d%%",percent);
  3421.         Fgl_setfontcolors(PROGBOX_BG_COLOUR,TEXT_FG_COLOUR);
  3422.         Fgl_write(PROGBOXX+(PROGBOXW/2)-20,PROGBOXY+24,s);
  3423.         Fgl_setfontcolors(TEXT_BG_COLOUR,TEXT_FG_COLOUR);
  3424.     }
  3425. #ifdef LC_X11
  3426.     XSync(display.dpy,FALSE);
  3427. #endif
  3428.     if (percent<100)
  3429.     {
  3430.         return;
  3431.     }
  3432.  
  3433.  
  3434.     Fgl_putbox(PROGBOXX-8,PROGBOXY-8,PROGBOXW+16,PROGBOXH+16,progbox);
  3435.     redraw_mouse();
  3436.     flag=0;
  3437. }
  3438.  
  3439.